#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