GIMP 创建 XPM 图像的 C 头文件中的头像素说明

Spe*_*ner 4 c gimp header-files xlib

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

如果我将 XPM 图像保存为 C 头文件,GIMP 将输出此 C 头文件

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

#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; \
}
Run Code Online (Sandbox Code Playgroud)

当我看到它在另一个人的代码中使用时,他们表示字节顺序是错误的,并自行重新排列。他们这样使用它:

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;
}
Run Code Online (Sandbox Code Playgroud)

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

提前致谢!

Dre*_*ann 5

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

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

33仅通过使用可打印字符即可解决此问题97。这提供了 6 位信息,因此每四个字符将提供 24 位,可以表示 3 个字节的所有排列。