Я собирание изображение из галереи с помощью 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?
Плюсы: этот способ прост и чист. Минусы: 1) регенерирует гораздо больше памяти, 2) мы не можем масштабировать его – Dev
Как это может потребовать слишком много памяти? Оба подхода используют растровые изображения. – TomTom