使用 Linux XRender 进行图像处理
一 核心概念与前置准备
xdpyinfo | grep XRender。开发时建议安装开发包(如 libxrender-dev),编译时链接 -lX11 -lXrender。二 最小可用示例 从 Pixmap 到屏幕合成
gcc -o xrender_demo xrender_demo.c -lX11 -lXrender#include <X11/Xlib.h>
#include <X11/extensions/Xrender.h>
#include <stdio.h>
int main(void) {
Display *dpy = XOpenDisplay(NULL);
if (!dpy) { fprintf(stderr, "无法打开显示\n"); return 1; }
int scr = DefaultScreen(dpy);
Window root = RootWindow(dpy, scr);
unsigned int w = 320, h = 240;
// 1) 创建一个可绘制的 Pixmap(24/32 位)
Pixmap pm = XCreatePixmap(dpy, root, w, h, DefaultDepth(dpy, scr));
// 2) 获取与之关联的 Picture(使用 ARGB32 格式)
XRenderPictureAttributes attrs = {0};
Picture src_pic = XRenderCreatePicture(dpy, pm, PictStandardARGB32, &attrs, 0);
Picture dst_pic = XRenderCreatePictureFromDrawable(dpy, root, PictStandardARGB32, &attrs, 0);
// 3) 清屏为半透明红(示例:用 32 位像素数据填充)
GC gc = XCreateGC(dpy, pm, 0, NULL);
XSetForeground(dpy, gc, 0x80FF0000); // ARGB: 50% 透明红
XFillRectangle(dpy, pm, gc, 0, 0, w, h);
XFreeGC(dpy, gc);
// 4) 合成到根窗口(PictOpOver 实现 Alpha 叠加)
XRenderComposite(dpy, PictOpOver, src_pic, None, dst_pic,
0, 0, 0, 0, 100, 100, w, h);
// 5) 刷新并清理
XFlush(dpy);
XRenderFreePicture(dpy, src_pic);
XRenderFreePicture(dpy, dst_pic);
XFreePixmap(dpy, pm);
XCloseDisplay(dpy);
return 0;
}
三 常见图像处理操作与 API 组合
attrs.opacity = 0x80; 表示约 50% 不透明度)。四 性能优化与排错要点
XRenderQueryExtension)、函数返回值与 XError 处理,及时释放 Picture/Pixmap 等资源。