2012-02-16 3 views
5

내 앱에서 카메라를 사용하여 이미지를 가져 와서 flickr에 업로드합니다. 업로드하는 데 시간이 오래 걸리지 않도록 이미지를 압축하고 싶습니다. BitmapSource 및 WriteableBitmap의 'SaveJpeg'메서드를 사용하여이 작업을 수행했지만 실패했습니다. 비트 맵 소스에는 Silverlight/WP에서 사용할 수있는 동일한 멤버가 전체 .NET Framework 버전과 동일하지 않으며 WriteJeteg 메서드가 WriteableBitmap을 통해 '이 스트림에서 쓰기를 지원하지 않습니다.'오류가 발생합니다.Windows Phone에서 이미지를 압축하는 방법

이 내가 현재 내 CameraCaptureTask 완료 이벤트 처리기에서 뭐하는 거지입니다 :

private void CameraCaptureCompleted(object sender, PhotoResult e) 
    { 
     if (e == null || e.TaskResult != TaskResult.OK) 
     { 
      return; 
     }                
     BitmapImage bitmap = new BitmapImage {CreateOptions = BitmapCreateOptions.None};       
     bitmap.SetSource(AppHelper.LoadImage(e.ChosenPhoto)); 
     WriteableBitmap writeableBitmap = new WriteableBitmap(bitmap); 

     // Encode the WriteableBitmap object to a JPEG stream. 
     writeableBitmap.SaveJpeg(e.ChosenPhoto, writeableBitmap.PixelWidth, writeableBitmap.PixelHeight, 0, 85); 
    } 

이 코드는 나에게 준다 : 오류 "스트림이 쓰기를 지원하지 않습니다."

이미지를 압축 할 수있는 다른 방법이 있습니까, 아니면 압축 알고리즘을 작성해야합니까?

업데이트 고정 !!

private void CameraCaptureCompleted(object sender, PhotoResult e) 
    { 
     if (e == null || e.TaskResult != TaskResult.OK) 
     { 
      return; 
     }                
     BitmapImage bitmap = new BitmapImage {CreateOptions = BitmapCreateOptions.None};       
     bitmap.SetSource(AppHelper.LoadImage(e.ChosenPhoto)); 
     WriteableBitmap writeableBitmap = new WriteableBitmap(bitmap); 

     // Encode the WriteableBitmap object to a JPEG stream. 
     writeableBitmap.SaveJpeg(new MemoryStream(), writeableBitmap.PixelWidth, writeableBitmap.PixelHeight, 0, 85); 
    } 

원본 스트림에 쓰려고했습니다. 도!

감사합니다.

+0

PhotoResult e는 스트림이 아니므로 SaveJpeg가이를 목표로 작동하지 않습니다. 어디에서 사진을 저장 하시겠습니까? IsolatedStorage 또는 임시 스트림 또는 다른 곳에서 ... – ameer

+1

새로운 MemoryStream()에 저장하면 지금 저장 한 위치에 대한 참조가 없으므로 메모리 스트림을 생성하기 전에 메모리 스트림을 전달하는 것이 가장 좋습니다 일단 압축하면 메모리 스트림에서 직접 업로드하거나 격리 된 저장소에 저장하고 나중에 업로드 할 수 있습니다. – ameer

답변

3

SaveJpeg는 제가 생각하기에이 방법입니다. 당신은 아마 다른 방법으로 그것을 할 수 있지만, 나는 그것이 가장 쉽고 가장 자연 스럽다고 생각합니다. SaveJpeg로 전달하는 스트림이 쓰기 가능하지 않기 때문에 '이 스트림은 쓰기를 지원하지 않습니다.'오류가 발생했을 수 있습니다. 즉 당신은 마지막 매개 변수의 품질을 조정할 수 등

처럼
using System.IO; 

// ... 

MemoryStream ms = new MemoryStream(); 
pic.SaveJpeg(ms, pic.PixelWidth, pic.PixelHeight, 0, 0, 50); 

를 작동하는 경우 난 당신이 그냥 평범한 오래된 메모리 스트림을 사용하여 시도하고 볼 쓰기를 시도 정확히 모르겠어요. PixelWidth/Height는 WriteableBitmap입니다. 따라서 다른 소스가있는 경우 너비/높이를 가져 오는 다른 메소드/속성을 사용해야 할 수도 있습니다. 카메라의 사진이 꽤 커질 수 있기 때문에 이러한 크기를 조절할 수 있습니다. 이 사진을 업로드하는 대상에 따라 다르지만 크기를 조정하면 파일 크기를 줄일 수 있습니다.

+0

답장을 보내 주셔서 감사합니다. 위의 코드 스 니펫으로 게시물을 업데이트했습니다. 그것이 내가 현재 직면 한 것입니다. – Cranialsurge

관련 문제