XLib窗口背景颜色反转

时间:2014-01-30 19:42:32

标签: colors background window png xlib

我几乎在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

1 个答案:

答案 0 :(得分:1)

我找到了解决方案here。我不确定这是否是最好的方法,但更简单。