Я почти там с моим маленьким «окно с фона 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.