我几乎在Linux中使用我的“窗口背景来自PNG图像”项目。我使用纯 X11 API和最小LodePNG来加载图片。问题是背景是原始PNG图像的负面影像,我不知道可能是什么问题。
这基本上是加载图像然后创建像素图并将背景应用于窗口的代码:
// required headers
// global variables
Display *display;
Window window;
int window_width = 600;
int window_height = 400;
// main entry point
// load the image with lodePNG (I didn't modify its code)
vector<unsigned char> image;
unsigned width, height;
//decode
unsigned error = lodepng::decode(image, width, height, "bg.png");
if(!error)
{
// And here is where I apply the image to the background
Screen* screen = NULL;
screen = DefaultScreenOfDisplay(display);
// Creating the pixmap
Pixmap pixmap = XCreatePixmap(
display,
XDefaultRootWindow(display),
width,
height,
DefaultDepth(display, 0)
);
// Creating the graphic context
XGCValues gr_values;
gr_values.function = GXcopy;
gr_values.background = WhitePixelOfScreen(display);
// Creating the image from the decoded PNG image
XImage *ximage = XCreateImage(
display,
CopyFromParent,
DisplayPlanes(display, 0),
ZPixmap,
0,
(char*)&image,
width,
height,
32,
4 * width
);
// Place the image into the pixmap
XPutImage(
display,
pixmap,
gr_context,
ximage,
0, 0,
0, 0,
window_width,
window_height
);
// Set the window background
XSetWindowBackgroundPixmap(display, window, pixmap);
// Free up used resources
XFreePixmap(display, pixmap);
XFreeGC(display, gr_context);
}
图像被解码(并且有可能被严重解码)然后它应用于背景但是,正如我所说,图像颜色是反转的,我不知道为什么。
更多信息
解码后,我将同一图像编码成与解码后的PNG文件相同的PNG文件,因此看起来问题与LodePNG无关,而是与我玩XLib以便将其放在窗口上的方式相关。
更多信息 现在我将倒置图像与原始图像进行比较,发现在我的代码中某处RGB转换为BGR。如果原始图像上的一个像素是 95,102,119 ,则它是 119,102,95 。