【问题标题】:How to load bmp file using x11 window background如何使用 x11 窗口背景加载 bmp 文件
【发布时间】:2013-02-21 18:33:05
【问题描述】:

我尝试使用 bmp 文件在 x11 窗口中设置背景图像。我使用了 XReadBitmapFile 但它不起作用。如何使用 bmp 文件设置 x11 窗口背景。提前致谢

【问题讨论】:

  • 您能向我们展示您的尝试吗?
  • GC gc = XCreateGC (d, w, 0, NULL); int 资源 = XReadBitmapFile(d, w, "demo.bmp", &width, &height, &bitmap, &x, &y); XCopyPlane(d, bitmap, w, gc, 0, 0, width, height, 0, 0, 1);

标签: c++ linux x11 embedded-linux xlib


【解决方案1】:

XReadBitmapFile 仅用于读取 .xbm 文件。需要一个用于读取 BMP 文件的库,一种可能是 ImLib2,它可以读取多种类型的文件并与 Xlib 配合使用。

这是一个使用它的较长示例:

/* displays an image or sets root background
 * PUBLIC DOMAIN - CC0 http://creativecommons.org/publicdomain/zero/1.0/
 * J.Mayo 2013
 *
 * gcc -Wall -W -g3 -o xrootbg xrootbg.c -lX11 -lImlib2
 *
 */
#include <stdio.h>
#include <X11/Xlib.h>
#include <Imlib2.h>

int main(int argc, char **argv)
{
    Imlib_Image img;
    Display *dpy;
    Pixmap pix;
    Window root;
    Screen *scn;
    int width, height;
    const char *filename = NULL;

    if (argc < 2)
        goto usage;
    filename = argv[1];

    img = imlib_load_image(filename);
    if (!img) {
        fprintf(stderr, "%s:Unable to load image\n", filename);
        goto usage;
    }
    imlib_context_set_image(img);
    width = imlib_image_get_width();
    height = imlib_image_get_height();

    dpy = XOpenDisplay(NULL);
    if (!dpy)
        return 0;
    scn = DefaultScreenOfDisplay(dpy);
    root = DefaultRootWindow(dpy);

    pix = XCreatePixmap(dpy, root, width, height,
        DefaultDepthOfScreen(scn));

    imlib_context_set_display(dpy);
    imlib_context_set_visual(DefaultVisualOfScreen(scn));
    imlib_context_set_colormap(DefaultColormapOfScreen(scn));
    imlib_context_set_drawable(pix);

    imlib_render_image_on_drawable(0, 0);
    XSetWindowBackgroundPixmap(dpy, root, pix);
    XClearWindow(dpy, root);

    while (XPending(dpy)) {
        XEvent ev;
        XNextEvent(dpy, &ev);
    }
    XFreePixmap(dpy, pix);
    imlib_free_image();
    XCloseDisplay(dpy);
    return 0;
usage:
    fprintf(stderr, "usage: %s <image_file>\n", argv[0]);
    return 1;
}

【讨论】:

  • 现在可以使用了,谢谢。是否有任何“Imlib2”手册可以了解 Imlib2 中的各种 API
  • link 有完整的文档和一些有用的例子。 Imlib2 只是可用于执行此操作的众多库之一,它们的工作原理大致相同。但是其他人可能会要求您使用 XImage 而不是为您进行渲染,但是 XImage 非常简单并且是标准 xlib 的一部分。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-27
  • 2011-04-23
  • 2010-12-03
  • 1970-01-01
  • 2014-01-22
  • 1970-01-01
相关资源
最近更新 更多