2012-01-16 1 views
4

В GIMP вы можете сохранить изображение в виде файла заголовка C. Я сделал это с файлом XPM, который выглядит как на картинке ниже:Объяснение пикселя заголовка в 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?» и так далее. Если кто-нибудь может дать объяснение тому, что происходит, чтобы обработать данные изображения в заголовке, это было бы высоко оценено.

Заранее благодарен!

+0

ASCII 33 is '!'. Я бы угадал его base64 или что-то похожее –

ответ

3

Каждый пиксель представлен 3 байтами. Эти пиксели определяются как массив символов, называемый header_data.

Проблема заключается в том, что не каждый байт является печатным символом, который может существовать в этом заголовочном файле.

Это разрешается только с использованием печатных знаков 33 по 97. Это дает 6 бит информации, поэтому каждые четыре символа выдают 24 бита, которые могут представлять все перестановки в 3 байта.