2013-01-05 67 views
0

我在Windows Phone 7相機app.I需要轉換捕獲流工作,使用EXIF幫助解決它旋轉並保存爲質量,方向,輸出尺寸JPEG parameters.I其次exif rotation文章修復旋轉。但核心問題是我需要首先將流解碼爲jpeg,然後執行上述的旋轉修復以將圖片保存到媒體庫。內存問題在WP7

我使用以下代碼:

private WriteableBitmap DecodeImage(Stream photo, int angle) 
{ 
      WriteableBitmap source = PictureDecoder.DecodeJpeg(photo); 

      photo.Seek(0, SeekOrigin.Begin);   

      System.GC.Collect(); 

      UiDispatcher.BeginInvoke(() => 
      { 
       MessageBox.Show(App.LogMemory("after decode")); 
      }); 
      switch (angle) 
      { 
       case 90: 
       case 270: 
        return RotateBitmap(source, source.PixelHeight, 
         source.PixelWidth, angle); 
       case 180: 
        return RotateBitmap(source, source.PixelWidth, 
         source.PixelHeight, angle); 
       default: 
        return source; 
      } 
      return null; 
     } 

在RotateBitMap方法我有旋轉邏輯在鏈接中指定,但它從源創建一個新的 WritableBitmap對象如下:

WritablBitmap target = new WritableBitmap(soure.width,source.height); //source is the bitmap passed in argument. 

問題是

PictureDecoder.decodejpeg - 爲我的相機拍攝的流爲30MB拍攝流 和創建旋轉流方法中的新位圖耗用30 MB以上。導致60 MB應用程序內存的加速。

這是造成應用程序崩潰由於在下端(256MB)視窗電話設備存儲器。 爲什麼解碼JPEG取30MB和30MB流的旋轉。(我試過源和目標在旋轉流的方法,位圖設置爲null,強制GC,但沒有use.Applications的幾乎沒有得到devices.How 60MB我可以應付了這個要求??

任何想法。如何優化內存的消耗在這些情況下???

注:我需要從rotatestream方法,結果,可以採取位圖,因爲我需要使用位圖保存爲JPEG與輸出尺寸,質量

回答

1

當你使用JPEG解碼,你通常會結束你p的照片全尺寸。 在情況下,它是採取8MP(大約8000000個像素)的攝像頭,該計算是這樣的:

8000000 * 32位= 256 000 000比特用於在存儲器中的一個圖象(這大致圍繞30MB)

(讓我提醒你,HTC Titan II擁有1600萬像素的攝像頭,所以如果你使用了全尺寸的照片,它在內存中大概佔用大約62MB)。 30MB。爲了以某種方式操作照片,您通常無法在適當的位置進行操作。換句話說,你需要創建一個副本,這就是它重複的原因。 Windows Phone有一種方法可以通過自動降低加載圖片的分辨率來防止如此大的內存消耗,但只有在將BitmapImage和SetSource方法(以JPEG流作爲參數)使用它時纔可以防止這種大量內存消耗。

我在我的文章How to open and work with large photos on Windows Phone前一段時間寫了一篇關於它和它在performance considerations for Windows Phone

提到所以,基本上,你應該減少加載照片的大小(你需要它在全尺寸呢?)和BitmapImage class可以很容易地做到這一點爲您自動保留它在2000×2000像素,這大約15MB(MAX),所以你應該罰款,如果你不想與被人打擾你。