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;
обработка файла BMP
есть трудность - не могу понять как в С++ работать файлом BMP?(просмотр,редактирование , ...)
структуру bmp-файла нашел:
Код:
потом пишу
Код:
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();
}
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();
}
Код:
#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;
}
#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 байту, остальное - по умолчанию
спасиб за ценную инфу!!!
скинь если есть у тебя как нидь инфа по БМР-формату :-)
а то я замучился искать (((
Каждая строка изображения выровнена на границу 4 байт (по крайней мере, в 24-битных изображениях). Т. е. если ширина картинки - 13 пикселей, в байтах 13*3 = 39, надо после чтения каждой строки читать незначащий 1 байт.
Кроме того, в более "продвинутых" версиях BMP структура BITMAPINFOHEADER может выглядеть по-другому и называться соответственно BITMAPV4HEADER или BITMAPV5HEADER, но эти структуры обратно совместимы с BITMAPINFOHEADER (т. е. начальные байты имеют то же значение, что и BITMAPINFOHEADER).
А вообще, читайте MSDN.
Может быть чтобы получить доступ к данным из структуры файла его нужно спроецировать в память, подобно тому как это делается при получении данных из PE-файла?
А какая разница. И так, и так можно прочитать правильные данные.