2014-01-30 4 views
0

Я почти там с моим маленьким «окно с фона PNG image» проект в Linux. Я загружаю фотографии: X11 API и минимальный размер изображения LodePNG. Проблема в том, что фон является отрицательным от исходного изображения PNG, и я не знаю, в чем проблема.XLib Window имеет цвета перевернутые

В основном это код, который загружает изображение, а затем создает растровое изображение и применяет фон к окну:

// 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-файл, который идентичен декодируется один, так что похоже проблема не связана с LodePNG, но к тому, как я играть с XLib чтобы поместить его в окно.

ДАЖЕ ПОДРОБНЕЕ Теперь я сравнил перевернутое изображение с исходной и узнал, что где-то в коде RGB преобразуется в BGR. Если один пиксель на исходном изображении равен 95, 102, 119 на инвертированном, это 119, 102, 95.

ответ

1

Я нашел решение here. Я не уверен, что это лучший способ, но проще.