Изображения PNG в файлах ресурсов VS2010, которые делают странные вещи на XP с GDI + - PullRequest
1 голос
/ 29 июня 2011

Я использую несколько 32-битных файлов PNG в своем проекте VS2010 и загружаю их в растровые изображения GDI + с помощью LoadResource / LockResource и т. Д. И создаю из IStream. Все отлично работает на моей машине для разработки Win7.

Тем не менее, я делаю некоторые цвета и альфа-маскирование, используя SetColorMatrix / ImageAttributes, который отлично работает на Win7, но когда я запускаю его на XP и вызываю Bitmap :: DrawImage с параметром ImageAttributes, PNG вообще не рисуется , Похоже, в любой момент не было никаких ошибок, указывающих на проблему, она просто не видна.

Если я запускаю тот же код с изображением, загруженным непосредственно из файла, а не из ресурса, он отлично работает на XP и Win7, но я не очень хочу связывать файлы PNG в моем установщике - кажется, немного бодж. Чтобы сделать эту жизнь еще более захватывающей, моя машина XP слишком медленная, чтобы даже подумать о том, чтобы запустить VS2010!

Есть ли у кого-нибудь какие-либо идеи о том, что может вызвать это, или предложения, чтобы отследить проблему, потому что я потратил много времени на это, и у меня нет вдохновения.

Заранее спасибо.

Обновление:

После дополнительного тестирования я не дошел до конца, но есть убедительные доказательства того, что использование конструктора Bitmap (IStream *) каким-то образом искажает альфа-канал в PNG с прозрачностью. Я точно не понял, что происходит, но я нашел решение - теперь я использую FreeImage для загрузки PNG из файла ресурсов, а затем создаю объект Bitmap из необработанных данных изображения в FIBITMAP. Это работает отлично, поэтому доказательства указывают на проблему с этим конструктором Bitmap.

Обновление 2:

Класс, который я создал, чтобы использовать FreeImage для загрузки файлов PNG из ресурсов, прекрасно работает, поэтому для удобства я решил использовать его для загрузки всех своих изображений, но у него возникли проблемы с загрузкой стандартных файлов BMP. После небольшого исследования кажется, что, когда вы включаете файлы BMP в качестве ресурсов BITMAP, первые 14 байтов файла BMP удаляются, прежде чем они сохраняются в пакете ресурсов, что затрудняет загрузку их чем-либо еще. В любом случае, это легко обойти - я просто изменил тип ресурса ресурсов "BITMAP" на "BMP", поэтому он в основном обрабатывает его как неизвестный тип и сохраняет весь файл. Так что теперь все работает как задумано. Просто подумал, что я опубликую этот опыт и, надеюсь, сэкономлю кому-то еще час, если они попытаются сделать то же самое.

Ответы [ 2 ]

0 голосов
/ 28 мая 2012

Итак, я нашел ответ сам в конце (просто обновив его, чтобы пометить его как ответивший).

Похоже, что в некоторых ситуациях есть какая-то ошибка, связанная с GDI + и прозрачностью в PNG.Я справился с этим, используя FreeImage для загрузки PNG, но это вызвало еще одну проблему с BMP.Кажется, что ресурсы BITMAP в VS получают 14 байт, предположительно, поскольку это избыточная информация, если вы уже сказали VS, что это растровое изображение.Обычно это нормально, если вы затем загружаете ресурс с помощью LoadImage () или любой стандартной функции WinAPI, но если вы используете другую библиотеку (как я это делал с FreeImage), то вам нужно изменить тип ресурса на IMAGE (или что-то, что не BITMAP)), прежде чем пытаться загрузить его с помощью LoadResource.

0 голосов
/ 30 июня 2011

Поставьте несколько операторов трассировки и запустите на XP, где-то должен быть возвращен код ошибки.Старайтесь не использовать классы-оболочки MFC и вызывать исходный базовый win32 API.У меня был плохой опыт работы с CImage и друзьями;я конвертирую png в 32-битные растровые изображения (bmp), загружаю их с помощью :: LoadImage () и использую :: AlphaBlt () для их рисования.

Кроме того, попробуйте png без прозрачности - всепроблемы у меня были с изображениями с прозрачностью на пиксель.Если это сработает, вы хотя бы знаете, в каком направлении начинать искать.

...