CImg没有正确显示透明的png图像?

时间:2013-01-03 00:40:00

标签: c++ png libpng cimg

我在Visual Studio 2010中使用CImg与libpng结合来显示png图像。 当我使用CImg显示图像时,它似乎无法正确显示透明度。 如果我没有完全理解CImg的概念,我正在犯的错误,或者两者兼而有之,我不会起诉!

image showing the problem described

左侧图像显示在Windows照片查看器中打开的图像 - 背景透明,符合预期。 右侧的图像显示实际显示纯白色背景的CImg显示,周围有一些奇怪的棕色区域。

CImg正在使用第4个Alpha通道加载png(如右图像窗口标题所示)。当鼠标移动到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;
}

1 个答案:

答案 0 :(得分:4)

CImg的默认显示查看器只显示图像的3个第一个通道。 它甚至忽略了第4个通道确实是透明通道,它可能是其他东西(例如,CMYK编码图像的K通道)。 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彩色图像,它是在白色背景上渲染初始(透明)图像。