2012-01-16 91 views
4

在GIMP中,您可以将图像另存为C头文件。我与XPM文件,它看起来像下面的图片就如此GIMP中头文件像素的解释创建XPM图像的C头文件

如果我的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?”等等。如果任何人都可以解释处理头部中图像数据的过程,那将非常感激。

在此先感谢!

+0

ASCII 33是'!'。我会猜测它的base64或类似的东西 – 2012-01-16 02:50:48

回答

3

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

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

这是通过只使用可打印字符3397解决。这给出了6位信息,所以每四个字符将给出24位,这可以表示3个字节的所有排列。