Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

обработка файла BMP

13K
11 октября 2007 года
MXM
22 / / 16.08.2006
привет всем!!
есть трудность - не могу понять как в С++ работать файлом BMP?(просмотр,редактирование , ...)

структуру bmp-файла нашел:
Код:
struct  stBitMapFileHeader    //  Структура-заголовок файла
{      
 char       bfType[2];    //  Тип файла - строка "BM"    
 unsigned long  bfSize;       //  Размер файла в байтах
 unsigned int   bfReserved1;  //  Резерв     
 unsigned int   bfReserved2;  //  Резерв     
 unsigned long  bfOffBits;    //  Смещение начала изображения
} stBitMapFileHeader;

struct stBitMapInfoHeader       //  Структура-заголовок изображения
{
  unsigned long biSize;        //  Размер заголовка     
  unsigned long biWidth;       //  Ширина изобр.в пикселах     
  unsigned long biHeigth;      //   Высота изобр.в пикселах    
  unsigned int  biPlanes;      //  Число плоскостей изобр      
  unsigned int  biBitCount;    //  Бит/пиксел 1,4,8,24    
  unsigned long biCompression; //  Тип сжатия     
  unsigned long biSizeImage;   //  Размер сжатого изображения      
  unsigned long   biXPelsPerMeter;// Горизонтальное разрешение     
  unsigned long biYPelsPerMeter;// Вертикальное разрешение пикс/м       
  unsigned long biClrUsed;     //  Количество используемых цветов      
  unsigned long biClrImportant;//  Число "важных" цветов  
}  stBitMapInfoHeader;

потом пишу
Код:
int main(){
 clrscr();
 
 ifstream fbmp;

 fbmp.open("bmp1.bmp");

 if(!fbmp )
    cout<<"Error open "<<fbmp<<"\a\n" ;

 else{
      //здесь хочу прочитать стуктуру ,например stBitMapFileHeader;
       ....
      fbmp>>stBitMapFileHeader.bfSize;
      cout<<stBitMapFileHeader.bfSize; //выводит почемуто 0 ???
       ...
      fbmp.close();
     }
32K
12 октября 2007 года
uzz
7 / / 03.10.2007
Код:
#include <iostream>
#include <fstream>

using namespace std;

#pragma pack(push,1)
struct stBitMapFileHeader         //  Структура-заголовок файла
{      
   char bfType[2];            //  Тип файла - строка "BM"    
   unsigned long bfSize;       //  Размер файла в байтах
   unsigned int bfReserved1;      //  Резерв     
   unsigned int bfReserved2;      //  Резерв     
   unsigned long bfOffBits;    //  Смещение начала изображения
} bmphdr;
#pragma pack(pop)

int main(int argc, char *argv[])
{
    ifstream fin("file.bmp", ios::in | ios::binary);
   
    if(!fin) {
       cerr<<"Could not open file"<<endl;
       return 1;
    }
   
    fin.read((char*) &bmphdr, sizeof(stBitMapFileHeader));
     
    cout<<"size of file="<<bmphdr.bfSize<<" bytes"<<endl;
   
    fin.close();
     
    return 0;
}


во первых это сырые двоичные данные, и их надо вводить при помощи функции read объекта fstream:
fin.read((char*) &bmphdr, sizeof(stBitMapFileHeader));
этой строчкой читается весь заголовок целиком в структуру bmphdr. тут есть еще косяк с размером этой структуры. компилятор(по крайней мере у меня со стандартными настройками) выравнивает эту структуру до 20 байт, т.е. sizeof(stBitMapFileHeader)==20 (хотя сумма членов занимает 18). для того, чтобы сделать выравнивание по 1 байту я написал директивы #pragma pack(push,1) ... #pragma pack(pop).
все, что между этими директивами выравнивается по 1 байту, остальное - по умолчанию
13K
12 октября 2007 года
MXM
22 / / 16.08.2006
привет, uzz !
спасиб за ценную инфу!!!
скинь если есть у тебя как нидь инфа по БМР-формату :-)


а то я замучился искать (((
350
14 октября 2007 года
cheburator
589 / / 01.06.2006
Еще инфа.
Каждая строка изображения выровнена на границу 4 байт (по крайней мере, в 24-битных изображениях). Т. е. если ширина картинки - 13 пикселей, в байтах 13*3 = 39, надо после чтения каждой строки читать незначащий 1 байт.
Кроме того, в более "продвинутых" версиях BMP структура BITMAPINFOHEADER может выглядеть по-другому и называться соответственно BITMAPV4HEADER или BITMAPV5HEADER, но эти структуры обратно совместимы с BITMAPINFOHEADER (т. е. начальные байты имеют то же значение, что и BITMAPINFOHEADER).
350
14 октября 2007 года
cheburator
589 / / 01.06.2006
А вообще, читайте MSDN.
21K
28 октября 2007 года
Gais
23 / / 28.03.2007
Может быть чтобы получить доступ к данным из структуры файла его нужно спроецировать в память, подобно тому как это делается при получении данных из PE-файла?
350
29 октября 2007 года
cheburator
589 / / 01.06.2006
А какая разница. И так, и так можно прочитать правильные данные.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог