Объяснение пикселя заголовка в GIMP, созданном файлом заголовка C изображения XPM

В 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; \
}

Когда я увидел его использование в коде другого человека, они заявили, что порядок байтов был неправильным, и изменили его сами. Они использовали это так:

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?» и так далее. Если кто-нибудь может объяснить, что происходит с данными изображения в заголовке, это будет очень признательно.

Заранее спасибо!


person SpeedBurner    schedule 16.01.2012    source источник
comment
ASCII 33 — это !. Я бы предположил, что это base64 или что-то подобное   -  person J. Holmes    schedule 16.01.2012


Ответы (1)


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

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

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

person Drew Dormann    schedule 16.01.2012