将XCreateImage与LodePNG一起使用时出现意外故障

将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

我正在尝试在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);
    }
}
//此处的标题(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轴上重复。