我正在使用rust-xcb
编写应用程序。但是,当我尝试将文件加载到像素图中时,找不到任何方法。我还使用image
库加载图像文件(jpg)。
但是我不熟悉xcb,xcb是否可以将像素缓冲区或文件加载到pixmap中?或者我可以找到另一个图书馆来做到这一点?
我已经搜索了。 xcb像素图和位图的某些文档充满了TODO。
我尝试过xcb-util-image
,但没有找到我需要的东西。
我的代码如下:
let foreground = self.connection.generate_id();
xcb::create_gc(
&self.connection,
foreground,
screen.root(),
&[
(xcb::GC_FOREGROUND, screen.white_pixel()),
(xcb::GC_GRAPHICS_EXPOSURES, 0),
],
);
let mut img = image::open(background_src).unwrap();
let img_width = img.width();
let img_height = img.height();
xcb::create_pixmap(
&self.connection,
24,
pixmap,
self.window_id,
img_width as u16,
img_height as u16,
);
let img_buffer = img.to_rgb().into_raw();
xcb::put_image(
&self.connection,
xcb::IMAGE_FORMAT_Z_PIXMAP as u8,
pixmap,
foreground,
img_width as u16,
img_height as u16,
0,
0,
0,
24,
&img_buffer,
);
self.flush(); // Flush the connection
答案 0 :(得分:0)
根据XCB文档,像素图和窗口都是可绘制的:https://xcb.freedesktop.org/colorsandpixmaps/(“在窗口或像素图上相同的操作都带有xcb_drawable_t参数”)
因此,一旦created,您的Pixmap,您将其作为第三个参数传递给put_image
。无需担心将Pixmap转换为Drawable;它们都只是在您的末端键入u32
的别名,并且它们都在X服务器的末端使用相同的ID空间(正如同一份文档所说,“像素图基本上是一个未显示的窗口在屏幕上”)。
要生成data
参数中包含的内容,可能只需执行与libpng源代码相同的操作,但要用Rust而不是C。