使用 XPutImage 显示 png 文件不起作用

2023-12-14

我尝试使用 xputimage 在 xwindow 中显示 png 文件。但 xputimage 抛出以下错误:

窗口宽度 - '426';高度 - '341'

X 请求失败错误:BadMatch(参数属性无效) 失败请求的主要操作码:72 (X_PutImage) 失败请求的序列号:11 输出流中的当前序列号:12

我尝试更改 xputimage 的参数但仍然出现相同的错误。请帮帮我..

源代码如下:

/*
 * simple-drawing.c - demonstrate drawing of pixels, lines, arcs, etc.
 *                    on a window. All drawings are done in black color
 *                    over a white background.
 */

#include <X11/Xlib.h>`

#include <stdio.h>`

#include <stdlib.h>     /* getenv(), etc. */`

#include <unistd.h>     /* sleep(), etc.  */`

#include <png.h>`



Window
create_simple_window(Display* display, int width, int height, int x, int y)

{

  int screen_num = DefaultScreen(display);

  int win_border_width = 2;

  Window win;


  win = XCreateSimpleWindow(display, RootWindow(display, screen_num),
                            x, y, width, height, win_border_width,
                            BlackPixel(display, screen_num),
                            WhitePixel(display, screen_num));

  /* make the window actually appear on the screen. */

  XMapWindow(display, win);

  /* flush all pending requests to the X server. */

  XFlush(display);

  return win;

}

GC create_gc(Display* display, Window win, int reverse_video)

{

  GC gc;                /* handle of newly created GC.  */

  unsigned long valuemask = 0;      /* which values in 'values' to  */

                    /* check when creating the GC.  */

  XGCValues values;         /* initial values for the GC.   */

  unsigned int line_width = 2;      /* line width for the GC.       */

  int line_style = LineSolid;       /* style for lines drawing and  */

  int cap_style = CapButt;      /* style of the line's edje and */

  int join_style = JoinBevel;       /*  joined lines.       */

  int screen_num = DefaultScreen(display);

  gc = XCreateGC(display, win, valuemask, &values);

  if (gc < 0) {

    fprintf(stderr, "XCreateGC: \n");

  }

  /* allocate foreground and background colors for this GC. */

  if (reverse_video) {

    XSetForeground(display, gc, WhitePixel(display, screen_num));

    XSetBackground(display, gc, BlackPixel(display, screen_num));

  }

  else {

    XSetForeground(display, gc, BlackPixel(display, screen_num));

    XSetBackground(display, gc, WhitePixel(display, screen_num));

  }


  XSetLineAttributes(display, gc, line_width, line_style, cap_style, join_style);


  XSetFillStyle(display, gc, FillSolid);

  return gc;

}

static void TeardownPng (png_structp png, png_infop info)
{

        if (png) {

                png_infop *realInfo = (info? &info: NULL);

                png_destroy_read_struct (&png, realInfo, NULL);

        }

}

void LoadPng (FILE *file, unsigned char** data, char **clipData, unsigned int *width, unsigned int *height, unsigned int *rowbytes)

{

        size_t size = 0,  clipSize = 0;

        png_structp png = NULL;

        png_infop info = NULL;

        unsigned char **rowPointers = NULL;

        int depth = 0,
            colortype = 0,
            interlace = 0,
            compression = 0,
            filter = 0;

        unsigned clipRowbytes = 0;


png = png_create_read_struct (PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);

info = png_create_info_struct (png);

        png_init_io (png, file);

        png_read_info (png, info);

        png_get_IHDR (png, info, (png_uint_32*)width, (png_uint_32*)height, &depth, &colortype, &interlace, &compression, &filter);



        *rowbytes = png_get_rowbytes (png, info);

        if (colortype == PNG_COLOR_TYPE_RGB) {

                // X hates 24bit images - pad to RGBA
                png_set_filler (png, 0xff, PNG_FILLER_AFTER);

                *rowbytes = (*rowbytes * 4) / 3;

        }

        png_set_bgr (png);


        *width = png_get_image_width (png, info);

        *height = png_get_image_height (png, info);

        size = *height * *rowbytes;

        clipRowbytes = *rowbytes/32;

        if (*rowbytes % 32)

                ++clipRowbytes;

        clipSize = clipRowbytes * *height;

        // This gets freed by XDestroyImage

        *data = (unsigned char*) malloc (sizeof (png_byte) * size);

        rowPointers = (unsigned char**) malloc (*height * sizeof (unsigned char*));

        png_bytep cursor = *data;

    int i=0,x=0,y=0;

        for (i=0; i<*height; ++i, cursor += *rowbytes)

                rowPointers[i] = cursor;

        png_read_image (png, rowPointers);

        *clipData = (char*) calloc (clipSize, sizeof(unsigned char));

        if (colortype == PNG_COLOR_TYPE_RGB) {

                memset (*clipData, 0xff, clipSize);

        } else {

                // Set up bitmask for clipping fully transparent areas

                for (y=0; y<*height; ++y, cursor+=*rowbytes) {

                        for (x=0; x<*rowbytes; x+=4) {

                                // Set bit in mask when alpha channel is nonzero

                                if(rowPointers[y][x+3])

                                        (*clipData)[(y*clipRowbytes) + (x/32)] |= (1 << ((x/4)%8));

                        }

                }

        }

        TeardownPng (png, info);

    free (rowPointers);

}

void
main(int argc, char* argv[])

{

  Display* display;     /* pointer to X Display structure.           */

  int screen_num;       /* number of screen to place the window on.  */

  Window win;           /* pointer to the newly created window.      */

  unsigned int display_width,
               display_height;  /* height and width of the X display.        */

  unsigned int width, height;   /* height and width for the new window.      */

  char *display_name = getenv("DISPLAY");  /* address of the X display.      */

  GC gc;            /* GC (graphics context) used for drawing    */

                /*  in our window.               */

  unsigned width_ = 0, height_ = 0;


        unsigned char *data = NULL;

        char *clip = NULL;

        unsigned rowbytes = 0;

        unsigned long *image, *mask;

  /* open connection with the X server. */

  display = XOpenDisplay(display_name);

  if (display == NULL) {

    fprintf(stderr, "%s: cannot connect to X server '%s'\n",
            argv[0], display_name);

    exit(1);

  }

  /* get the geometry of the default screen for our display. */
  screen_num = DefaultScreen(display);

  display_width = DisplayWidth(display, screen_num);

  display_height = DisplayHeight(display, screen_num);

  /* make the new window occupy 1/9 of the screen's size. */

  width = (display_width / 3);

  height = (display_height / 3);

  printf("window width - '%d'; height - '%d'\n", width, height);



  win = create_simple_window(display, width, height, 0, 0);


  gc = create_gc(display, win, 0);

  XSync(display, False);

/* catch expose events */

  XSelectInput(display, win, ExposureMask);

  /* wait for the expose event */

  XEvent ev;

  XNextEvent(display, &ev);

// Load image

        FILE *file = fopen ("/games/splash_image.png", "r");

        if (!file)

                return;

        LoadPng (file, &data, &clip, &width_, &height_, &rowbytes);

        if (!data)

                return;
   XImage *ximage = XCreateImage (display, DefaultVisual (display, DefaultScreen (display)), 32, ZPixmap, 0, (char*)data, width, height, 8, rowbytes);

        if (ximage) {

                XPutImage (display, win, gc, ximage, 0, 0, 0, 0, width, height);

        XNextEvent(display, &ev);

        } else {

                free (data);

        }

//        free (clip);

// Load Image end


  /* flush all pending requests to the X server. */

  XFlush(display);

  XSync(display, False);

  /* make a delay for a short period. */

  sleep(4);

  /* close the connection to the X server. */

  XCloseDisplay(display);

}

如果参数不一致,XPutImage 将返回“BadMatch”。您指定的深度为 32 位,但该深度可能不可用。在调用 XCreateImage 之前尝试检查默认深度。

printf("default depth = %d\n", DefaultDepth(display, screen_num));

更改传递给 XCreateImage 的“深度”参数以匹配 DefaultDepth 返回的值。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 XPutImage 显示 png 文件不起作用 的相关文章

  • 如何阻止 X Window 接收用户输入?

    我想在 Linux 桌面上创建一些窗口以用于简单的布局 我需要避免用户输入到这些窗口 并且我认为避免窗口获得焦点就足以实现这种情况 我认为我可以用xprop命令 通过设置WM HINTS属性 但我还没有找到有关如何执行此操作的具体文档 顺便
  • VTK 与真实 X 一起工作,与 Xvfb 一起崩溃

    我正在调试一个第 3 方 Python 脚本 该脚本使用 VTK 库实现无头图像处理 当使用常规 X 窗口会话运行时 它会按预期工作 窗口会瞬间闪烁 当针对 Xvfb 内存中的虚拟帧缓冲区 运行时 它会崩溃 脚本是这样的 省略了一些废话 i
  • 帮助:达到最大客户端数 - 分段错误

    我想模拟很多按键事件 我通过使用找到了解决方案XTestFakeKeyEvent 但是当我模拟超过 210 次时 我的程序会引发 已达到最大客户端数 分段错误 我不知道如何解决这个问题 我的代码在这里 include
  • 使用 PyCharm 在远程服务器上进行 Python 绘图

    我已经开始学习 Python 到目前为止我的设置一直遵循 在 Win10 64 位本地计算机上安装 Python 3 5 并使用 PyCharm 作为一个很棒的 IDE 一切正常 matplotlib 图表和其他可视化输出显示良好 调试工作
  • 无法让 XCreateSimpleWindow 在正确位置打开窗口

    以下代码打开一个大小正确的窗口 w h 但位置不正确 x y include
  • 如何避免 Linux/X11 上的 pygame 撕裂

    我一直在玩 pygame 在 Debian Lenny 上 它似乎工作得很好 除了烦人的位图撕裂 全屏或窗口模式 我正在使用默认的 SDL X11 驱动程序 谷歌搜索表明 X11 不提供垂直同步功能 这是 SDL 的一个已知问题 即使使用使
  • 如何使用 C/C++ 获取数字锁定状态?

    我读过 Gdk 论坛链接 上面说从 3 0 版本开始就实现了获取 num lock state api 但我使用的是 2 4 版本 无法更新到 3 0 版本 因为我需要支持较低的 Linux 版本 这是讨论链接 http mail gnom
  • 检测合成器是否正在运行

    我希望我的 UI 根据屏幕是否合成 从而支持某些效果 来更改设计 是否有可能 可靠地查询 X 服务器是否正在运行合成窗口管理器 打开 关闭合成时收到通知吗 解决方案 为了向不太熟悉 X11 API 的人详细说明 Andrey Sidorov
  • Xkb:如何增加 XkbDescRec 键盘描述的客户端映射中的 KeySyms 数量?

    我正在尝试以编程方式修改 X11 中 xkb 键盘映射的一些属性 在里面XkbClientMapRec struct map的成员XkbDescRecstruct 我们有以下成员 typedef struct Client Map unsi
  • 如何获取Xvfb显示编号

    如何获取运行 Xvfb 时使用的显示编号 例如有人跑 Xvfb 14 我需要以某种方式获取使用过的显示器编号 14 提前致谢 在 UNIX 系统上 运行 ps ef grep Xvfb 它应该将其与流程一起列出
  • 使用 Ghostscript 作为 x11 查看器(gs x11 视口定位)?

    我已经知道了Ghostscript 前端 http en wikipedia org wiki Ghostscript Front ends观众 但我想知道如何gs本身可以用来查看PDF文档吗 我能得到的最接近的是明确指定x11窗口作为输出
  • XLib:获取光标图像

    有没有办法使用 Xlib 检索当前光标位图 我检查过X光标人 http www xfree86 org 4 3 0 Xcursor 3 html但我没有看到任何方法可以做到这一点 使用 GetCursorImage SelectCursor
  • 在 Ubuntu 上使用 R 获取抗锯齿图

    我升级了系统并重新安装了 R 现在我的标准 X 11 绘图没有抗锯齿 它们看起来呈锯齿状 而且字体看起来很糟糕 我似乎记得过去有过这样的问题 但不记得我做了什么 其他一些信息 qplot也出来了非抗锯齿 绘制到一个png设备也产生非抗锯齿输
  • 在哪里可以找到 /usr/include/X11/extensions/Xcomposite.h

    我需要将我的应用程序放在全屏视频上并捕获它以放入我的 python tkinter 应用程序中的 画中画 框架中 我回顾了通常的嫌疑人 图像抓取 mss等 但它们似乎都只是抓取监视器上可见的内容 似乎没有人能够抓住一扇看不见的窗户 我在以下
  • 使用 xlib 将图像加载到窗口上

    我已经创建了窗口类 我想插入图像作为该窗口的背景 文件格式必须为 png 我使用magick 的XImage来加载图像 但不知道如何将其作为我的窗口的背景 知道怎么做吗 使用创建像素图 Pixmap XCreatePixmap displa
  • FLTK 1.4 小部件位置 w.r.t. X11 根窗口?

    context 我正在和其他人一起编码参考系统 http refpersys org C 17 上的 GPLv3 项目gitlab https gitlab com bstarynk refpersys适用于 GNU Linux x86 6
  • Python:文本覆盖在所有窗口顶部,包括 Linux 中的全屏

    我正在尝试用 python 编写一个简单的脚本 在所有窗口和全屏应用程序之上输出文本 该脚本的目的是以类似于 Steam FPS 计数器工作方式的方式输出平均负载和可用内存 以及其他有用的统计数据 到目前为止 我尝试了 pygame 但据我
  • emacs 启动后更改 X11 窗口标题

    当我启动 emacs 时 我可以使用 title 选项来控制保存 emacs 应用程序的 x 窗口的标题 emacs从elisp启动后可以更改标题吗 M x set frame name NewName RET 和来自 elisp set
  • Yocto“无法运行 qemu:无法初始化 SDL(x11 不 > 可用)”

    所以我在本地构建服务器上安装了 Yocto 因为谁希望大规模构建占用他们的工作区 amirite 主机和服务器是Arch Linux 4 19 44 1 lts 无论如何 我只是从找到的快速构建页面运行示例here https www yo
  • 使用 X11 窗口的 R 脚本仅打开一秒钟

    我正在通过 Linux Mint 16 命令行运行 R 脚本 它包含我想在窗口中显示的箱线图 所以我使用 x11 函数来创建该窗口 这是我的代码 testdata lt data frame sample 1 1000 size 100 r

随机推荐

  • 如何使用CSS选择特定标签的第n个子元素?

    可以选择第4个吗 p 在下面的代码中标记并用 CSS 隐藏它 它既没有类属性也没有id p
  • 如何使用 akka-http 对自认证服务器进行 POST 调用

    我有一个 akka streams 拓扑 我使用 akka http 进行 POST 调用 当向不安全的服务器 具有自签名证书 发出发布请求时 我收到以下错误 这是一个内部服务器 所以从安全角度来看我没问题 javax net ssl SS
  • 如何使用 Swift 获取当前语言代码?

    我想在用 Swift 编写的应用程序中获取设备的语言代码 en es 怎么才能得到这个呢 我正在尝试这个 var preferredLanguages NSLocale let pre preferredLanguages displayN
  • 右侧带有计数器的导航视图菜单项

    The new 导航视图在新的设计支持库效果真的很棒 他们使用 菜单项 显示选项 但我怎样才能显示counter to the right菜单项的 就像这张照片中一样 或者像在GMail app 从 appcompat v7 版本 23 开
  • jQuery 与 jQuery Mobile - 脚本顺序重要吗?

    我不知道为什么 但当我以不同的顺序包含脚本时 它似乎会引起一些问题 当这样的时候 我的程序有效 小提琴也可以工作 http jsfiddle net yvonnezoe MKfLU 4 但 jQuery mobile 的 css 主题在我的
  • 使用 Runtime.getRuntime().exec() 执行 java 文件

    此代码将执行外部 exe 应用程序 private void clientDataActionPerformed java awt event ActionEvent evt TODO add your handling code here
  • 如何使用纯 Javascript (ES6) 按 id 合并两个 json 对象值

    我有两个 Javascript 对象数组 想要将两个具有相同 ObjID 的 Javascript 对象的属性合并到一个 Javascript 对象中 例如 Array of Javascript Objects 1 let request
  • CPU 中的多个核心是用于同时运行多个线程/进程,还是用于指令级并行?

    我只是想更清楚地了解多核的用途 以及多核和多 CPU 之间的区别 我试图了解拥有多个核心是否只是为了在给定的 CPU 中启用指令级并行性 或者 CPU 中的多个核心是否都有自己的 struct rq 让它们独立地调用 schedule 并在
  • 从 boost::gil::view 获取原始指针

    我有一个boost gil view这是交错的 我想从这个视图构建我自己的模型 它接受byte 原始像素数据 我如何获取原始数据指针boost gil view 我检查了它的接口 它返回定位器和所有内容 但不返回原始数据指针 请帮忙 我找到
  • 如何在当前目录中启动 Jupyter Lab 而不更改默认值?

    我的 Jupyter Notebooks 有一个默认目录 我将其放在 Jupyter 设置中 所以默认情况下jupytr lab命令在我需要启动的地方启动我的 Jupyter 然而 有时我处理单独的项目 从命令行在当前工作目录中启动 Jup
  • 哪些数字存在于向量中但不存在于另一个向量中[重复]

    这个问题在这里已经有答案了 我想这是一个非常简单的问题 v1 1 10 v2 c 2 4 7 所有数字均不重复 无需使用unique 我想要一个包含 v1 中不在 v2 中的所有值的向量 solution c 1 3 5 6 8 9 10
  • 如何绘制禁用图标

    我终于开始向下拉菜单添加图标了 In this image you can see that everything but the highlighted line is okay The highlighted line is fine
  • 如何从 openMP 中的线程生成子线程 (C++)

    我正在尝试构建一棵具有固定数量的子级和固定深度的树 我不完全理解 openMP 的底层机制 调用后开始构建树build root node 0 现在我们假设maxDepth给定一个任意数并且maxChildren等于n When build
  • Sharpsvn 日志消息编辑 Sharpsvn?

    使用sharpsvn 具体修订日志消息要更改 它的实现类似于 svn 的 show log edit logmessage 我英语很尴尬 所以 帮助你理解 我的代码已附上 public void logEdit Collection
  • 使用 JQuery 处理 PHP 异常

    我正在使用 JQuery 调用 PHP 函数 该函数在成功时返回 JSON 字符串或引发一些异常 目前我正在打电话jQuery parseJSON 在响应上 如果失败 我假设响应包含异常字符串 ajax type POST url some
  • 我听说 i++ 不是线程安全的,++i 线程安全吗?

    我听说 i 不是线程安全的语句 因为在汇编中它减少为将原始值存储为临时值 递增它 然后替换它 这可能会被上下文切换中断 但是 我想知道 i 据我所知 这将减少为一条汇编指令 例如 add r1 r1 1 并且由于它只是一条指令 因此它不会被
  • 后台Worker实现

    这是我的后台工作DoWor函数 考虑到GUI操作的实现好吗 private void backgroundWorker1 DoWork object sender System ComponentModel DoWorkEventArgs
  • C# Flurl - 将 WebRequestHandler 添加到 FlurlClient

    我正在与Flurl访问需要基于证书的身份验证的 API 我已经看到从这个帖子将证书添加到WebRequestHandler并指示HttpClient使用这个处理程序很容易 然而 我对 Flurl 的使用不太清楚 我尝试过以下三件事 扩展 D
  • 将数据从 javascript 弹出多行文本框传输到选择控件

    我正在尝试将数据从多行文本框传输到选择控件 多行文本框显示为弹出窗口 我希望用户在弹出窗口中单击 提交 后 将粘贴在文本框中的所有记录传输到选择控件 可能使用 jquery 或 javascript 或者其他东西 该页面是用 MVC3 Ra
  • 使用 XPutImage 显示 png 文件不起作用

    我尝试使用 xputimage 在 xwindow 中显示 png 文件 但 xputimage 抛出以下错误 窗口宽度 426 高度 341 X 请求失败错误 BadMatch 参数属性无效 失败请求的主要操作码 72 X PutImag