Я использую CImg в сочетании с libpng в Visual Studio 2010 для отображения изображений PNG.
Когда я отображаю изображение с помощью CImg, кажется, что оно неправильно отображает прозрачность.
Я не подаю в суд, если это я не до конца понимаю концепции CImg, ошибку, которую я совершаю, или их комбинацию!
Изображение слева показывает изображение, открытое в программе просмотра фотографий Windows, с прозрачным фоном, как и ожидалось.
Изображение справа показывает дисплей CImg, который фактически отображает чистый белый фон с некоторыми странными коричневыми областями, окружающими персонажа.
CImg загружает PNG с помощью 4-го альфа-канала (как показано в заголовке окна с правым изображением). При наведении курсора на области на экране CImg отображаются правильные значения прозрачности в небольшом всплывающем окне (внизу слева на правом изображении). CImg, кажется, рисует все, независимо от значения прозрачности?
У меня вопрос, как мне заставить Cimg правильно отображать pgn с прозрачными разделами?
Мой код для этого примера выглядит следующим образом:
#define cimg_use_png
#include <CImg.h>
using namespace cimg_library;
int main()
{
CImg<unsigned char> image("image.png");
image.display();
return 0;
}
Средство просмотра по умолчанию CImg просто показывает 3 первых канала вашего изображения.
Он даже игнорирует, что 4-й канал действительно является каналом прозрачности, это может быть что-то еще (например, K-канал для изображения в кодировке CMYK). CImg не хранит такую информацию, она позволяет пользователю узнать, что он в конце концов манипулирует.
Если у вас есть 4-й канал для прозрачности и что для его отображения в CImg, вы должны самостоятельно создать небольшую процедуру рендеринга, например:
CImg<unsigned char> render(img.width(),img.height(),1,3,255);
render.draw_image(0,0,0,0,img,img.get_channel(3),1,255);
(при условии, что ‘img’ — ваше 4-канальное изображение).
Теперь ‘render’ — это цветное изображение RGB, представляющее собой исходное (прозрачное) изображение на белом фоне.
Других решений пока нет …