xcb是否可以将文件加载到像素图中?

时间:2019-02-15 15:45:03

标签: rust xcb pixmap

我正在使用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

1 个答案:

答案 0 :(得分:0)

根据XCB文档,像素图和窗口都是可绘制的:https://xcb.freedesktop.org/colorsandpixmaps/(“在窗口或像素图上相同的操作都带有xcb_drawable_t参数”)

因此,一旦created,您的Pixmap,您将其作为第三个参数传递给put_image。无需担心将Pixmap转换为Drawable;它们都只是在您的末端键入u32的别名,并且它们都在X服务器的末端使用相同的ID空间(正如同一份文档所说,“像素图基本上是一个未显示的窗口在屏幕上”)。

要生成data参数中包含的内容,可能只需执行与libpng源代码相同的操作,但要用Rust而不是C。