2016-01-19 5 views
0

У меня есть простой вопрос о том, как читать заголовочный файл растрового изображения.Especifying Шестнадцатеричные значения в массиве в C для растровых файлов

У меня есть растровый массив как это:

typedef unsigned char byte; 
char bitmap[(188*180)+1024+54]; //The image size is 188*180 + the header file of 54 bytes+ the pallete table´s 1024 bytes 

I'm с указанием значения в соответствии с заголовком BMP, но у меня есть вопрос, когда имеющие значение that's больше байт. Например, ширина моего изображения составляет 288, что составляет 0x120 в шестнадцатеричном формате. Однако я не могу просто сказать:

bitmap[19] = 0x120; 

потому что это больше, чем один байт. В соответствии с тем, что я читаю, у меня есть двойное слово для хранения высоты моего изображения (это 4 байта), поэтому я могу использовать bitmap[20], bitmap[21] и bitmap[22] для хранения всего числа.

Как я должен делить число, чтобы получить то же значение, хранящееся в файле заголовка? Я не уверен, добавлены ли значения или читаются как один шестнадцатеричный номер при открытии файла bmp.

+0

Найдите определение 'struct', которое описывает заголовок растрового изображения, и следите за контентом. Вы * можете * разбить число на свои байты, но конечность все равно будет проблемой. –

+0

В стандартном байте C это то же самое, что и 'char', поэтому' typedef' в нем явно бесполезно и сбивает с толку в лучшем случае. Обратите внимание, что если вы имели 8-битный тип (например, октет), то байт не обязательно должен иметь 8 бит. Используйте типы 'stint.h' для фиксированной ширины (и конкретной кодировки). Также обратите внимание, что 'char' не имеет стандартной подписанности. – Olaf

+0

Вам также потребуется исследовать «бит на пиксель» (ваш 8) и «шаг», потому что длина строки растрового изображения может быть больше ширины изображения. –

ответ

1

TL; DR

Значения считываются как единый DWORD (32-битовый).


формат файла BMP описан в Wikipedia, а также во многих местах в Интернете. Обратите внимание, что правильное смещение составляет 18, а не 19, как вы предлагаете в своем вопросе. Таким образом, четыре байта на смещениях 18, 19, 20 и 21.

В коде:

typedef unsigned char byte; 
char bitmap[(188*180)+1024+54]; 

, чтобы заставить ширину изображений на 0x120, вы можете сделать это:

bitmap[18] = 0x20; 
bitmap[19] = 0x01; 
bitmap[20] = 0x00; 
bitmap[21] = 0x00; 

Или в общем случае:

uint32_t width = ...; // 0x120 in your case, any value in general case 
bitmap[18] = width & 0xff; 
bitmap[19] = (width >> 8) & 0xff; 
bitmap[20] = (width >> 16) & 0xff; 
bitmap[21] = (width >> 24) & 0xff; 

следует отметить, что наименее значимые байты должны быть Ио wer address (little-endian order) - это не всегда документируется, но всегда подразумевается при обсуждении структур данных в Windows.

+0

Спасибо за ваш ответ. Это было именно то, что мне нужно! –