2013-10-13 2 views
1

Я пытаюсь использовать объект WriteableBitmap, потому что мне нужно его для вращения изображений и сохранения изображений в изолированном хранилище моего приложения.WP8 WriteableBitmap конструктор хранит много памяти

Проблема в том, что она использует так много памяти, что в конечном итоге вызывает исключение из памяти.

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

Memory Chart

Вот пример того, где я использую WriteableBitmap:

 WriteableBitmap picture = new WriteableBitmap(PictureCanvas, null); 

     using (var memoryStream = new MemoryStream()) 
     { 
      picture.SaveJpeg(memoryStream, picture.PixelWidth, picture.PixelHeight, 0, 100); 

      using (var myIsolatedStorage = IsolatedStorageFile.GetUserStoreForApplication()) 
      { 
       using (IsolatedStorageFileStream fileStream = new IsolatedStorageFileStream(Globals.OVERLAY_FILE_NAME, FileMode.Create, myIsolatedStorage)) 
       { 
        fileStream.Write(memoryStream.ToArray(), 0, memoryStream.ToArray().Length); 
        fileStream.Close(); 
       } 
      } 
     } 

     picture = picture.Crop(0, 0, 1, 1); 

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

Я использую библиотеку расширений WriteableBitmap here, а на первой странице упоминает метод Dispose(), но я не вижу его в своем приложении.

Если кто-то может рассказать мне, как обойти эту проблему или указать мне где-нибудь, я могу найти возможное решение, это было бы потрясающе!

ответ

1

У меня a similar issue и продолжает расследование, но по крайней мере, небольшой совет, который я могу дать: если можно избавиться от MemoryStream и писать непосредственно к FileStream так:

WriteableBitmap picture = new WriteableBitmap(PictureCanvas, null); 
    using (var myIsolatedStorage = IsolatedStorageFile.GetUserStoreForApplication()) 
    using (IsolatedStorageFileStream fileStream = new IsolatedStorageFileStream(Globals.OVERLAY_FILE_NAME, FileMode.Create, myIsolatedStorage)) 
    { 
     picture.SaveJpeg(fileStream, picture.PixelWidth, picture.PixelHeight, 0, 100) 
    } 

Это должно купить вам некоторые Память.

+0

Я смог уменьшить использование памяти, установив для writeableBitmap значение null. Теперь я не включил это в свой вопрос, но я получал утечку памяти из кисти, и это на самом деле вызывало мою утечку. Я бы предложил установить значение null. Я также посмотрел на ваш код, и вы распоряжаетесь потоками, которые вы делаете, но не закрывайте их. Может быть, это поможет? Я также предложил бы сделать небольшое приложение, которое использует только writeableBitmap, чтобы сделать изображение, затем проверить использование памяти и продолжать строить свой небольшой образец, пока не найдете вашу утечку. –

+0

Спасибо Крису! Я взглянул на обрезку кисти, хотя заметил это. Утилизация потока автоматически закрывает его, проверяет его с помощью Reflector, IL Spy или любого другого средства декомпиляции. Это избыточно. –

+0

Однако, пожалуйста, попробуйте эту вещь, чтобы написать непосредственно в файлStream и избежать MemoryStream. MemoryStream использует встроенные байтовые массивы, которые многократно перераспределяются (удваиваются при каждом переполнении) и генерируют много мусора. В конце концов, я не вижу в этом никакой цели. –