c - GIMP 中 Header Pixel 的说明创建了 XPM 图像的 C 头文件

标签 c header-files xlib gimp

在 GIMP 中,您可以将图像保存为 C 头文件。我使用 XPM 文件执行此操作,如下图所示:

如果我将 XPM 图像保存为 C 头文件,GIMP 将输出 this C header file .

为了处理给定图像数据的每个像素,重复调用标题像素。我不明白的是标​​题像素首先是如何处理数据的。

#define HEADER_PIXEL(data,pixel) {\
pixel[0] = (((data[0] - 33) << 2) | ((data[1] - 33) >> 4)); \
pixel[1] = ((((data[1] - 33) & 0xF) << 4) | ((data[2] - 33) >> 2)); \
pixel[2] = ((((data[2] - 33) & 0x3) << 6) | ((data[3] - 33))); \
data += 4; \
}

当我在 another person's code 中看到它被使用时, 他们说字节顺序错误并自己重新排列。他们是这样使用它的:

char *pixel, *data = header_data;
int i = width * height;
*processed_data = pixel = malloc(i * 4 + 1);
while(i-- > 0) {
    pixel[0] = ((((data[2] - 33) & 0x3) << 6) | ((data[3] - 33)));
    pixel[1] = ((((data[1] - 33) & 0xF) << 4) | ((data[2] - 33) >> 2));
    pixel[2] = (((data[0] - 33) << 2) | ((data[1] - 33) >> 4));
    pixel[3] = 0;
    data += 4;
    pixel += 4;
}

但这并没有真正帮助我理解所有移位和按位或以及“为什么减去 33?”是怎么回事。等等。如果有人可以解释标题中的图像数据正在处理什么,将不胜感激。

提前致谢!

最佳答案

每个像素由 3 个字节表示。这些像素被定义为一个字符数组,命名为 header_data

问题是并非每个字节都是可打印字符,它可能存在于该头文件中。

这可以通过仅使用可打印字符 3397 来解决。这样就给出了6比特的信息,所以每四个字符就会给出24比特,可以表示3个字节的所有排列。

关于c - GIMP 中 Header Pixel 的说明创建了 XPM 图像的 C 头文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8875192/

相关文章:

c - 为什么 getch() 在以非常短的延迟调用 halfdelay() 之后读取 EOF?

c - 在 C 中应用具有未初始化变量的 XOR 运算符

c++ - 将 3rd 方头文件放在源代码树中的什么位置?

x11 - 在 X11 根窗口中检测修改键释放

python - 如何使用 Python Xlib 监视鼠标事件而不是捕获它们?

linux - Linux 上的无边框窗口

c - PostMessage 似乎不起作用?

c - 链接本地 `extern` 变量

c++ - 有模板方法但不公开实现

C++ 头文件 - 困惑!