Я пытаюсь использовать объект WriteableBitmap, потому что мне нужно его для вращения изображений и сохранения изображений в изолированном хранилище моего приложения.WP8 WriteableBitmap конструктор хранит много памяти
Проблема в том, что она использует так много памяти, что в конечном итоге вызывает исключение из памяти.
Вот изображение использования памяти моего приложения, с ссылкой на картинку here для лучшего просмотра.
Вот пример того, где я использую 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(), но я не вижу его в своем приложении.
Если кто-то может рассказать мне, как обойти эту проблему или указать мне где-нибудь, я могу найти возможное решение, это было бы потрясающе!
Я смог уменьшить использование памяти, установив для writeableBitmap значение null. Теперь я не включил это в свой вопрос, но я получал утечку памяти из кисти, и это на самом деле вызывало мою утечку. Я бы предложил установить значение null. Я также посмотрел на ваш код, и вы распоряжаетесь потоками, которые вы делаете, но не закрывайте их. Может быть, это поможет? Я также предложил бы сделать небольшое приложение, которое использует только writeableBitmap, чтобы сделать изображение, затем проверить использование памяти и продолжать строить свой небольшой образец, пока не найдете вашу утечку. –
Спасибо Крису! Я взглянул на обрезку кисти, хотя заметил это. Утилизация потока автоматически закрывает его, проверяет его с помощью Reflector, IL Spy или любого другого средства декомпиляции. Это избыточно. –
Однако, пожалуйста, попробуйте эту вещь, чтобы написать непосредственно в файлStream и избежать MemoryStream. MemoryStream использует встроенные байтовые массивы, которые многократно перераспределяются (удваиваются при каждом переполнении) и генерируют много мусора. В конце концов, я не вижу в этом никакой цели. –