В приложении .NET CF, которое я написал, одной из функций является получение кадров с удаленных камер. Кадры приобретаются как отдельные изображения в формате jpeg и отображаются на экране, если они доступны.
Это было достаточно хорошее решение, но мне не нравится тот факт, что время, необходимое для преобразования потока в объект Image с конструктором Bitmap(), составляет намного намного больше, чем время, необходимое для загрузки потока.
Когда я просмотрел несколько блогов в поисках этой проблемы, я обнаружил, что некоторые разработчики использовали метод Image.FromStream(), который имеет флаг validateImageData, который, кажется, управляет некоторым кодом проверки. Когда значение validateImageData ложно, преобразование происходит значительно быстрее.
Хорошо, подумал я .... но в Compact Framework этот метод не реализован!
Кто-нибудь знает, как это обойти или хотя бы как преобразовать поток в Image без лишних задержек?





Если размеры JPEG велики (например, 1200 x 1600 или что-то в этом роде), то одна из проблем скорости, с которыми вы сталкиваетесь на вашем устройстве с конструктором Bitmap, - это размер Bitmap, который необходимо создать в памяти (растровое изображение будет быть также 1200 x 1600, даже если он затем отображается на экране 240 X 320). Если вы можете получить JPEG с уже размером 320 X 240 вместо полноразмерного, время создания растрового изображения должно быть намного меньше.
Я не смог найти альтернатив отсутствующему методу FromStream, кроме конструктора Bitmap. Если вы знакомы с форматом JPEG, я не думаю, что было бы слишком сложно написать собственный конвертер JPEG в BMP, но я предполагаю, что он не будет быстрее, чем Bitmap ().
Обновлено: извините, я имел в виду, что ваш собственный свернутый конвертер не будет быстрее конвертировать 240 X 320 JPEG в растровое изображение 240 X 320. Я думаю, что это можно было бы сделать намного быстрее при преобразовании гораздо большего размера JPEG в растровое изображение 240 X 320, потому что он может сначала пропустить этап создания полноразмерного растрового изображения.
Не уверен, что это поможет, но в OpenNETCF.Drawing.Imaging есть классы для чтения изображений из потоков, но это com-объекты, обернутые в IImage. Затем вы можете использовать IImage.Draw, чтобы нарисовать его на своем растровом изображении. В нем также есть метод GetThumbnail, который я использую для получения на устройстве масштабированного изображения больших jpeg-файлов.
Здесь - это сообщение в блоге Алекса Фейнмана об этом.
Я не фанат OpenNETCF, но думаю, что попробую. Спасибо, Мэтт.
Что ж, классы, которые вам могут быть интересны, представляют собой обертки вокруг некоторых com-объектов, так что вы можете свернуть свои собственные, если хотите.
Спасибо, но размер изображения небольшой (320x240), но производительность при преобразовании все еще очень низкая (пропорционально).