Как очистить память WritableBitmap

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

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;

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

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

Потребляет меньше memory и мы можем scale вниз image

Другие вопросы по тегам