2012-01-16 34 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個字節的所有排列。