2014-10-13 3 views
2

Я собирание изображение из галереи с помощью PhotoChooserTask, вот моя установкакак очистить память WritableBitmap

private void ApplicationBarIconButton_Click(object sender, EventArgs e) 
{ 
    PhotoChooserTask photo = new PhotoChooserTask(); 
    photo.Completed += photo_Completed; 
    photo.Show(); 
} 

void photo_Completed(object sender, PhotoResult e) 
{ 
    if (e.ChosenPhoto != null) 
    { 
     WriteableBitmap wbmp1 = PictureDecoder.DecodeJpeg(e.ChoosenPhoto, (int)scrnWidth, (int)scrnHeight); 
     ImageBrush iBru = new ImageBrush(); 
     iBru.ImageSource = wbmp1; 
     iBru.Stretch = Stretch.Fill; 
     ContentPanel.Background = iBru; 
    } 
} 

Проблема: с таким образом он работает только с .JPEG изображениями

, чтобы сделать его работать с другими image formats, я попытался это:

void photo_Completed(object sender, PhotoResult e) 
{ 
    if (e.ChosenPhoto != null) 
    { 
     WriteableBitmap wBmp = new WriteableBitmap(0, 0);//6930432 
     wBmp.SetSource(e.ChosenPhoto);//23105536 
     MemoryStream tmpStream = new MemoryStream();//23105536 
     wBmp.SaveJpeg(tmpStream, (int)scrnWidth, (int)scrnHeight, 0, 100);//22831104 
     tmpStream.Seek(0, SeekOrigin.Begin);//22831104 

     WriteableBitmap wbmp1 = PictureDecoder.DecodeJpeg(tmpStream, (int)scrnWidth, (int)scrnHeight);//24449024 
     ImageBrush iBru = new ImageBrush();//24449024 
     iBru.ImageSource = wbmp1;//24449024 
     iBru.Stretch = Stretch.Fill; 
     ContentPanel.Background = iBru; 
    } 
} 

таким образом работает с различные форматы изображений, но это не эффективная память.

Я упомянул номер bytes, используемый после каждой строки для лучшего понимания.

Вопрос: В последнем фрагменте кода мне больше не нужен wbmp, как я могу очистить память, используемую объектом wbmp?

ответ

2

Избавиться от WriteableBitmap, вместо того, чтобы сделать что-то вроде этого:

var bmp = new System.Windows.Media.Imaging.BitmapImage(); 
bmp.SetSource(e.ChosenPhoto); 
var ib = new ImageBrush() { ImageSource = bmp, Stretch = Stretch.Fill }; 
ContentPanel.Background = ib; 
+0

Плюсы: этот способ прост и чист. Минусы: 1) регенерирует гораздо больше памяти, 2) мы не можем масштабировать его – Dev

+0

Как это может потребовать слишком много памяти? Оба подхода используют растровые изображения. – TomTom

4

Как @Soonts предложил я использовал BitmapImage и он решает мою цель,

BitmapImage bmp = new BitmapImage(); 
bmp.DecodePixelWidth = (int)scrnWidth; 
bmp.DecodePixelHeight = (int)scrnHeight; 
bmp.SetSource(e.ChosenPhoto); 

Он потребляет меньше memory и мы можем scaleimage

 Смежные вопросы

  • Нет связанных вопросов^_^