将XCreateImage与LodePNG一起使用时出现意外故障
我正在尝试在Linux中向X11窗口添加背景图像。我使用简单的LodePNG将PNG图像解码为原始数据(RGBA),然后尝试设置窗口背景。 发生的情况是,窗口显示一段时间后意外关闭。如果注释掉将XCreateImage与LodePNG一起使用时出现意外故障,image,background,window,png,xlib,Image,Background,Window,Png,Xlib,我正在尝试在Linux中向X11窗口添加背景图像。我使用简单的LodePNG将PNG图像解码为原始数据(RGBA),然后尝试设置窗口背景。 发生的情况是,窗口显示一段时间后意外关闭。如果注释掉XCreateImage和XPutImage函数(包括析构函数),窗口将正确显示,因此窗口创建不是问题。 我的代码如下所示: // Headers here (xlib, lodepng) ... // Global vars ... Display *display; Window window; in
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);
}
}
//此处的标题(xlib,lodepng)。。。
//全球变量。。。
显示*显示;
窗口窗口;
int window_width=640;
内窗高度=480;
//入口点、初始化、窗口创建。。。
int main(int argc,char*argv[]){
矢量图像;//原始像素
无符号宽度、高度;
//解码
无符号错误=lodepng::decode(图像、宽度、高度,“bg.png”);
//如果没有错误,请继续
如果(!错误)
{
Pixmap Pixmap=XCreatePixmap
(
展示,,
XDefaultRootWindow(显示),
宽度,
高度,
默认深度(显示,0)
);
xgc值gr_值;
GC gr_context=XCreateGC
(
展示,,
窗口,
背景,,
&gr_值
);
//这就是它失败的地方!!!
无符号行字节=0;
XImage*XImage=XCreateImage
(
展示,,
CopyFromParent,
32,
XYPixmap,
0,
(char*)image.data(),
宽度,
高度,
32,
行字节
);
XPutImage(
展示,,
pixmap,
gr_上下文,
西玛吉,
0, 0,
0, 0,
窗宽,
窗高
);
XSetWindowBackgroundPixmap(显示、窗口、pixmap);
XFreePixmap(显示,pixmap);
XFreeGC(显示、gr_上下文);
XDestroyImage(ximage);
}
}
在我解码PNG后,我可以看到我得到了正确的图像宽度和高度。原始数据的大小(
image
变量)总是819200,不管我选择什么图像,这有点奇怪,我想知道LodePNG是否没有正确加载图像(但它没有给出错误和正确的宽度和高度)。这个问题的其他原因,我不知道。我没有收到任何错误消息,窗口只是在被看到一点后关闭。也许XCreateImage
的一些参数是错误的,但我无法确定哪个。数据长度应该对应于像素数(对于rgba32,它是像素x 4)。另外,我认为这里需要使用ZPixmap作为pixmap格式。现在的问题是图像颜色反转,图像没有在窗口上拉伸,而是在XY轴上重复。