我正在尝试在Linux中将背景图像添加到X11窗口。我使用简单的LodePNG将PNG图像解码为原始数据(RGBA)然后我尝试设置窗口背景。
发生的事情是窗口显示一段时间后意外关闭。如果我注释掉XCreateImage
和XPutImage
函数(包括析构函数),则窗口会正确显示,因此窗口创建不是问题。
我的代码如下所示:
// Headers here (xlib, lodepng) ...
// Global vars ...
Display *display;
Window window;
int window_width = 640;
int window_height = 480;
// Entry point, initialization, window creation ...
int main(int argc, char* argv[]) {
vector<unsigned char> image; //the raw pixels
unsigned width, height;
// Decode
unsigned error = lodepng::decode(image, width, height, "bg.png");
// If there's no error continue
if(!error)
{
Pixmap pixmap = XCreatePixmap
(
display,
XDefaultRootWindow(display),
width,
height,
DefaultDepth(display, 0)
);
XGCValues gr_values;
GC gr_context = XCreateGC
(
display,
window,
GCBackground,
&gr_values
);
// Here is where it fails !!!
unsigned rowbytes = 0;
XImage *ximage = XCreateImage
(
display,
CopyFromParent,
32,
XYPixmap,
0,
(char*)image.data(),
width,
height,
32,
rowbytes
);
XPutImage(
display,
pixmap,
gr_context,
ximage,
0, 0,
0, 0,
window_width,
window_height
);
XSetWindowBackgroundPixmap(display, window, pixmap);
XFreePixmap(display, pixmap);
XFreeGC(display, gr_context);
XDestroyImage(ximage);
}
}
解码PNG后,我可以看到图像的宽度和高度正确。原始数据(image
变量)的大小总是819200,无论我选择什么图像,这有点奇怪,我想知道LodePNG是否没有正确加载图像(但它没有给出错误和正确的宽度和高度)。这个问题的其他原因,我不知道。我没有得到任何错误消息,窗口只是在看到一点后关闭。也许XCreateImage
的一些论点是错误的,但我无法弄清楚哪一个。