Чтение bmp файла
От: gradik Россия  
Дата: 07.11.05 15:31
Оценка:
Я прочитала файл bmp.

BITMAPFILEHEADER fh;
BITMAPINFOHEADER ih;
RGBQUAD rgbQ;
BITMAPINFO info;

void main(){
  int nread;
  int fd;
  int bitsize;      /* Size of bitmap */
  int infosize;     /* Size of header information */

  fd = open("256_1.bmp", O_RDONLY);
  nread = read(fd, (void*)&fh, sizeof(BITMAPFILEHEADER));

  infosize = fh.bfOffBits - sizeof(BITMAPFILEHEADER);
  BITMAPINFO info2;
 
  nread = read(fd, (void*)&info2, infosize);

  if ((bitsize = info2.bmiHeader.biSizeImage) == 0)
    bitsize = (info2.bmiHeader.biWidth *
               info2.bmiHeader.biBitCount + 7) / 8 *
      abs(info2.bmiHeader.biHeight);
  
 char bits[bitsize]; 

  nread = read(fd, bits, bitsize);
  
  for(int i = 0; i < 1; i++)
    cout<<&(bits[i])<<endl;
 
  int cl = close(fd);
}


при распечатывании массива bits[0] в консоли получается моя картинка, но какими-то символами.
Как можно понять, какой символ соответствует какому цвету и правильно ли я считала файл?
Буду очень благодарна, если кто-то сможет мне помочь

08.11.05 09:32: Перенесено модератором из 'C/C++. Прикладные вопросы' — Павел Кузнецов
Re: Чтение bmp файла
От: korzhik Россия  
Дата: 07.11.05 17:16
Оценка:
Здравствуйте, gradik, Вы писали:

G>Я прочитала файл bmp.


G>
G>BITMAPFILEHEADER fh;
G>BITMAPINFOHEADER ih;
G>RGBQUAD rgbQ;
G>BITMAPINFO info;

G>void main(){
G>  int nread;
G>  int fd;
G>  int bitsize;      /* Size of bitmap */
G>  int infosize;     /* Size of header information */

G>  fd = open("256_1.bmp", O_RDONLY);
G>  nread = read(fd, (void*)&fh, sizeof(BITMAPFILEHEADER));

G>  infosize = fh.bfOffBits - sizeof(BITMAPFILEHEADER);
G>  BITMAPINFO info2;
 
G>  nread = read(fd, (void*)&info2, infosize);

G>  if ((bitsize = info2.bmiHeader.biSizeImage) == 0)
G>    bitsize = (info2.bmiHeader.biWidth *
G>               info2.bmiHeader.biBitCount + 7) / 8 *
G>      abs(info2.bmiHeader.biHeight);
  
G> char bits[bitsize]; 

G>  nread = read(fd, bits, bitsize);
  
G>  for(int i = 0; i < 1; i++)
G>    cout<<&(bits[i])<<endl;
 
G>  int cl = close(fd);
G>}
G>


G>при распечатывании массива bits[0] в консоли получается моя картинка, но какими-то символами.

G>Как можно понять, какой символ соответствует какому цвету и правильно ли я считала файл?
G>Буду очень благодарна, если кто-то сможет мне помочь

Я так понял тебе надо изобразить картинку в текстовом режиме?
Тогда вот эта ссылка должна помочь.
Re[2]: Чтение bmp файла
От: gradik Россия  
Дата: 09.11.05 11:34
Оценка:
Здравствуйте, korzhik, Вы писали:

K>Здравствуйте, gradik, Вы писали:



G>>при распечатывании массива bits[0] в консоли получается моя картинка, но какими-то символами.

G>>Как можно понять, какой символ соответствует какому цвету и правильно ли я считала файл?
G>>Буду очень благодарна, если кто-то сможет мне помочь

K>Я так понял тебе надо изобразить картинку в текстовом режиме?

K>Тогда вот эта ссылка должна помочь.

Спасибо за ссылку, но это не то, что мне нужно

Я как раз могу получить мою картинку в символах, но мне надо эти символы как-то преобразовать, чтобы я знала, какой символ какому цвету соответствует! Т.е. получить массив не символов, а массив цветов.

P.S. Спасибо модератору за перенос письма на другой форум
Re[3]: Чтение bmp файла
От: Андрей Россия  
Дата: 09.11.05 11:52
Оценка:
Здравствуйте, gradik, Вы писали:

skip

G>Я как раз могу получить мою картинку в символах, но мне надо эти символы как-то преобразовать, чтобы я знала, какой символ какому цвету соответствует! Т.е. получить массив не символов, а массив цветов.



Так это очень сильно от количества цветов в растре зависит
Если это 256-цветный растр, то у него есть палитра и каждый байт изображения есть индекс в этой самой палитре. Это простейший случай.
Если это 2-цветный растр, то каждый байт содержит 8 пикселов, которые в свою очередь являются индексами в палитре.
Если это 16-цветный растр, то каждый байт содержит по 2 пиксела, являющихся индексами в палитре.
Если растр полноцветный, то каждые 3 байта соответствуют 1-му пикселу в формате BGR (заметь, не RGB, а именно BGR). Никакой палитры здесь нет.
Для растра с альфа-каналом используются уже по четыре байта на пискел — три байта задают BGR и 1 — прозрачность.
Для экзотических форматов (15 и 16-битных) все немного сложнее — там идет упаковка.
Да, упаковка в RLE может применяться и для 16 и 256-цветных растров тоже.

Для первых трех случаев палитра присутствует в самом растре — см. структуру BITMAPINFO.

Вообще, формат bmp-файла (точнее DIB-файла) очень подробно описан в MSDN. См. BITMAPINFOHEADER
Re[4]: Чтение bmp файла
От: Андрей Россия  
Дата: 09.11.05 12:01
Оценка:
Здравствуйте, Андрей, Вы писали:

skip

Сорри, немного прогнал насчет 15-битных bmp — таковых в природе не существует
И кроме того, для всех непалитровых форматов (более 256 цветов, исключая 24-х битовый) может применяться "упаковка" (см. BI_BITFIELDS) — хотя я в своей практике таковых не встречал
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.