Исключение OutOfMemory для нового Bitmap()

#vb.net #compact-framework

#vb.net #compact-framework

Вопрос:

Я должен нарисовать что-то на изображении, которое захвачено камерой. Это работает на многих устройствах, но иногда ОЗУ слишком мало или изображения слишком большие, и функция завершает работу с исключением OutOfMemory.

Как я могу: а) оптимизировать код, чтобы предотвратить эти исключения б) Обработать эти исключения (уменьшить размер изображений, освободить оперативную память и т.д.

вот код:

  Dim from_bmp As Bitmap
 Dim bmp As Bitmap

 from_bmp = New Bitmap(picname)
 'I also tryed this with a function which is creating the Bitmap from Filestream
 'I also tryed this with the OpenNETCF.Drawing.Imaging.IImage
 'If the Original Pictiure is too big, the function will crash here.

 bmp = New Bitmap(from_bmp.Width, from_bmp.Height   stampheight)
 'now I Create a bitmap which is higher than the original, in order to write the stamp beneth the picture

 Dim font As New System.Drawing.Font("Arial", 30, FontStyle.Regular)
 gr = Graphics.FromImage(bmp)
 gr.DrawImage(from_bmp, 0, 0)
 from_bmp.Dispose()
 'here I draw somethin in the Bitmap
 bmp.Save(deststring, System.Drawing.Imaging.ImageFormat.Jpeg)
 gr.Dispose()
 bmp.Dispose()
  

Комментарии:

1. Обновление системной памяти — лучший выбор

2. @Gens Это исключение обычно возникает на многих платформах, не только Windows, не только .NET.

3. это net.cf код выполняется на мобильных устройствах, я не могу обновить память на них ^^

4. Насколько велико изображение (ш x в) и какова глубина его цвета?

5. это зависит от настроек камеры устройства, я использую эту функцию на 1800 мобильных устройствах и использую около 20 различных типов. Ist работает хорошо годами, но проблема возникает очень часто на новом Motorola ES400. Изображения на этом устройстве имеют размер (в самом маленьком случае) 1024 * 1380 пикселей, 192 dpi, 24 бита

Ответ №1:

Я бы, скорее всего, использовал шаблон «using» для ваших растровых изображений. Кроме того, имейте в виду, что ООМ при создании Bitmap часто можно преодолеть, просто попробовав еще раз (вот обличительная речь о том, почему). Держу пари, что куча GC слишком заполнена, и второй запрос, особенно после сбора, будет успешным.

Я бы просмотрел остальную часть кода (которая не показана) и убедился, что все остальные графические объекты утилизируются должным образом — CF не очень хорошо справляется с автоматической очисткой собственных ресурсов графических объектов и часто нуждается в небольшой помощи (опять же, смотрите Ссылку выше).

Комментарии:

1. да, я должен упомянуть, что я выполняю GC.collect(), я удаляю все растровые изображения, которые я использую, и в блоке catch я пробую это снова после GC.WaitForPendingFinalizers