Xorg 加载图像

发布于 2024-07-09 06:40:29 字数 93 浏览 8 评论 0原文

我开始编写自己的窗口管理器,并且想知道如何使用 xorg api 从原始图像数据(例如 libpng 给出的数据)获取 Xorg Pixmap 或 Xorg 可绘制的内容?

I'm starting to code up my own window manager, and was wondering how to use the xorg api to get from raw image data ( such as the data given by libpng ), into an Xorg Pixmap or something drawable by Xorg?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

晨光如昨 2024-07-16 06:40:29

您可能在 2008 年以来的某个时候发现了这一点,但为了未来读者的利益...

XCreatePixmapFromBitmapData() 会将文字位图(即 1 位、黑白)数据加载到像素图中。 如果目标是从 PNG 加载,这很可能不是您想要的。

一种较新的方法是使用 Cairo 或 GdkPixbuf。 老式的 Xlib API,例如 XCreatePixmapFromBitmapData() 和 XDrawWhatever() 几乎都已被弃用(并不是说它们实际上会被删除,而是它们已经过时并且与现代应用程序的工作方式不同步)。

人们现在通常推荐的做法是:

  • 比起 libX11 更喜欢 libxcb,libxcb 只是 X 协议的一个非常薄的包装器,并且缺少执行多个 X 协议请求的调用(例如 CreatePixmapFromBitmapData 执行 CreatePixmap、CreateGC、PutImage、FreeGC)
  • 更喜欢 cairo (或类似的库,Skia 是其中之一)而不是服务器端绘图 API

您可以使用 cairo_image_surface_create_from_png() 来实现简单的目的,或者如果您需要支持更多格式等,则可以使用 GdkPixbuf。

You probably discovered this at some point since 2008, but for the benefit of future readers...

XCreatePixmapFromBitmapData() will load literal bitmap (i.e. 1-bit, black&white) data into a pixmap. This is most likely not what you want, if the goal is to load from a PNG.

A newer way to do this is to use Cairo or GdkPixbuf. The old-school Xlib APIs such as XCreatePixmapFromBitmapData() and XDrawWhatever() are all pretty much deprecated (not that they will actually be removed ever, but they are outdated and out of sync with how modern apps work).

The way people would generally recommend doing things these days is:

  • prefer libxcb to libX11, libxcb is just a very thin wrapper around the X protocol and lacks calls that do multiple X protocol requests (for example CreatePixmapFromBitmapData does CreatePixmap, CreateGC, PutImage, FreeGC)
  • prefer cairo (or comparable library, Skia is one) to the server-side drawing APIs

You could use cairo_image_surface_create_from_png() for simple purposes or GdkPixbuf if you need to support more formats, etc.

帥小哥 2024-07-16 06:40:29

XCreatePixmapFromBitmapData 应该做到这一点。 请记住,您需要输入与 xserver 正在使用的位深度相同的数据。

XCreatePixmapFromBitmapData should do just that. Remember that you need to feed in data of the same bit depth as your xserver is using.

雪若未夕 2024-07-16 06:40:29

您必须与 XCreateImage、XCreatePixmap 和 XCopyArea 进行一些互动。 它有点像这样:

struct Image img = get_pixels_and_geometry_from_libpng("filename.png");
XImage *img = XCreateImage(/*5000 paremeters*/);
Pixmap pixmap = XCreatePixmap(dpy, img.width, img.height, 24);
XPutImage(dpy, pixmap, gc, 0, 0, img.width, img.height);
XCopyArea(dpy, pixmap, window, 0, 0, img.width, img.height, x, y);

There's a little dance with XCreateImage, XCreatePixmap and XCopyArea you have to do. It goes a little like this:

struct Image img = get_pixels_and_geometry_from_libpng("filename.png");
XImage *img = XCreateImage(/*5000 paremeters*/);
Pixmap pixmap = XCreatePixmap(dpy, img.width, img.height, 24);
XPutImage(dpy, pixmap, gc, 0, 0, img.width, img.height);
XCopyArea(dpy, pixmap, window, 0, 0, img.width, img.height, x, y);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文