Аннотация:
Класс CPictureEx добавляет в MFC-приложения поддержку изображений следующих форматов: GIF (в том числе анимированных), JPEG, BMP, WMF, ICO и CUR.
Класс полезный. Однако, хотелось бы добавить в него сериализацию — иногда хочется хранить свою коллекцию картинок, а не коллекцию файлов. Сам я ее добавил не эффективным способом — сохраняя при загрузке картинки сырую область памяти, и потом уже записывая ее в архив. Наверняка можно сделать лучше, но это надо разбираться.
Хотелось бы еще раз уточнить совместимость с Win98
Обнаружил мелкий баг, из-за которого на _некоторых_ версиях WinXP вместо указанного цвета фона под прозрачными областями картинки был белый цвет... Проблема в следующей строке (она есть в двух местах компонента):
FillRect(m_hMemDC,&rect,(HBRUSH)(COLOR_WINDOW));
Непонятно каким чудом, но на W9X и Win2K эта строка заливала область rect цветом COLOR_3DFACE!
Но на некоторых версиях WIN_XP вдруг начало заливать белым.
При чем если поменять "(HBRUSH)(COLOR_WINDOW)" на "(HBRUSH)(COLOR_3DFACE)" то заливать будет тоже _белым_ даже на Win2K.
Способ лечения: заменить эту строчку на нечто вроде
Но заливка неанимированных GIF-ов (в анимированных imho заливка фона еще раз происходит непосредственно перед выводом кадра в треде нужным цветом) всегда будет вестись цветом COLOR_3DFACE, поэтому здесь наверное лучше использовать цвет из переменной background...
Данный класс не будет работать на Win95, даже при IE4, так как в kernrl32.dll нет функции CreateWaitableTimer(). Она появилась несколько позже в Win98, поэтому, так сказать, неполная совместимость.
Поскольку я использую данный класс для отображения только неанимированных gif`ов, то я решил проблему простым выкидыванием части класса, отвечающей за анимацию.
Но может сложиться ситуация, когда будет необходима функциональность для Win95.
Я не призываю автора переписывать класс для совместимости, а просто констатирую факт. Если нужна анимация под Win95 — придется пересмотреть механизм ее реализации.
Для Олег Быков: спасибо за класс. Что называется, easy to use... Даже Bounds Checker только в обном месте ругается, да и то не по делу... :)
Все работает, правда пришлось подкрутить чуток, что бы выводился GIF с действительно прозрачными областями. В оригинальном CPictureEx прозрачный цвет заменялся цветом COLOR_3DFACE.
Насколько я понял, Unisys держит права не на формат GIF, а на использование алгоритма сжатия LZW, который в этом формате используется. В CPictureEx не реализован свой декодер LZW, для этого используется функция WinAPI OleLoadPicture, так что я проблем с показом GIF не вижу.
Я не совсем понял, о каком прозрачном цвете идет речь — прозрачность в этом классе вообще не планировалась (и, соответственно, не реализована). Для реализации прозрачности нужно знать, что находится под гифом, а это, на мой взгляд, в общем случае задача нетривиальная. В качестве замены прозрачные области GIF'а заливаются предполагаемым цветом фона, на котором лежит картинка (по умолчанию действительно COLOR_3DFACE). Этот цвет можно изменить функцией CPictureEx::SetBkColor(COLORREF), о чем и написано, кстати, в сопроводительной статье.
Не могли бы Вы написать мне подробнее о доработке на e-mail : oleg_bykoff@rsdn.ru ? Если это действительно что-то стоящее, я с удовольствием внесу исправления и упомяну Ваше имя в сопроводительной статье и в комментариях класса.
Re: Класс CPictureEx
От:
Аноним
Дата:
16.08.04 13:58
Оценка:
Здравствуйте, Олег Быков, Вы писали:
ОБ>Статья:
ОБ>Авторы: ОБ> Олег Быков
ОБ>Аннотация: ОБ> Класс CPictureEx добавляет в MFC-приложения поддержку изображений следующих форматов: GIF (в том числе анимированных), JPEG, BMP, WMF, ICO и CUR
некорректно выводит interlaced animated gif'ы и animated gif'ы с оптимизацией (удалением неинформативных областей)
можно ли это поправить, если конечно сквозь толщу времен меня услышит многоуважаемый автор?