gpt4 book ai didi

c - _NET_WM_ICON 的图片格式

转载 作者:太空宇宙 更新时间:2023-11-03 23:19:52 24 4
gpt4 key购买 nike

环境:Ubuntu 16.04

在我的应用程序中,我通过使用 _NET_WM_ICON 原子调用 XGetWindowProperty 来获取应用程序的图标。

unsigned char* data;
XGetWindowProperty(..., &data);
unsigned long* data1 = (unsigned long*) data;
long width = *data1;
long height = *(data1 + 1)
unsigned char* imageData = (unsigned char*) (data1 + 2);

以下是返回数据的规范:

https://specifications.freedesktop.org/wm-spec/wm-spec-1.3.html#idm140130317554480

根据规范,返回的图像必须是 packed-32 ARGB 格式。但是,我得到的图像似乎不正确。我终于用我自己的图标创建了一个测试应用程序。是一个实心图标,RGB值分别为0x20、0x40、0x80。

当我在调试器中检查我的变量 imageData 时,这是我看到的:

0x80, 0x40, 0x20, 0xff, 0xff, 0xff, 0xff, 0xff (repeat the pattern)

看起来格式是 BGRA,带有额外的四个字节的填充。

如果有人能解释这种差异,我将不胜感激。问候。

最佳答案

在 CentOS 7 的 XGetWindowProperty(3) 手册页中,这指的是您为其传递参数 data 的参数:

       prop_return                 Returns the data in the specified format.  If the returned                 format is 8, the returned data is represented as a char                 array. If the returned format is 16, the returned data is                 represented as a array of short int type and should be cast                 to that type to obtain the elements. If the returned format                 is 32, the property data will be stored as an array of longs                 (which in a 64-bit application will be 64-bit values that are                 padded in the upper 4 bytes).

我假设您会发现 actual_format_return 是 32(因为规范似乎表明这是 _NET_WM_ICON 的唯一有效格式),并且可能是您的应用程序是 64 位,这意味着您的 long 类型是 64 位长,因此是填充。

至于为什么填充位都设置为1而不是0,我不太确定。手册页中的函数签名显示 unsigned char **prop_return,但上面引用的文本说它是一个“array of longs”,而不是“an array of unsigned longs”,所以也许这是旨在从字面上理解(或者是由您正在检索其图标的应用程序的作者从字面上理解),并且在您的应用程序接收数据之前的某个地方发生了一些符号扩展。

关于c - _NET_WM_ICON 的图片格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43237104/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com