3

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

显示所描述问题的图像

左侧的图像显示了在 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;
}
4

1 回答 1

4

CImg 的默认显示查看器仅显示图像的前 3 个通道。它甚至忽略了第四个通道确实是一个透明通道,它可能是其他东西(例如,用于 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 通道图像)。现在“渲染”是一个 RGB 彩色图像,它是您的初始(透明)图像在白色背景上的渲染。

于 2013-01-03T14:45:09.673 回答