Мне необходимо прочитать bmp-файл, два заголовка я считал, что дальше делать не пойму. Знаю только что каждая точка представлена 3-мя байтами, по байту на каждый цвет, а вот как разбить это все на 3-и матрицы где каждый цвет отдельно не пойму. Объясните. Вот мой исходник на всякий случай: bmpheader.h
| Код | #include <iostream> #include <fstream> using namespace std;
class BITMAPFILEHEADER { public: char bfType[2]; unsigned int bfSize; unsigned short int bfReserved1; unsigned short int bfReserved2; unsigned int bfOfBits;
BITMAPFILEHEADER() { bfType[2]='\0'; bfSize=0; bfReserved1=0; bfReserved2=0; bfOfBits=0; } void Show() { cout << "bfType: " << bfType << endl; cout << dec <<"bfSize: " << bfSize <<" bytes" << endl; cout << dec <<"bfReserved1: " << bfReserved1 << endl; cout << dec <<"bfReserved2: " << bfReserved2 << endl; cout << dec <<"bfOfBits: " << bfOfBits << endl;
} void Read(ifstream* f) { (*f).read(bfType,2); (*f).read((char*)&bfSize,4); (*f).read((char*)&bfReserved1,2); (*f).read((char*)&bfReserved2,2); (*f).read((char*)&bfOfBits,4);
}
};
class BITMAPINFOHEADER { public: unsigned int biSize; unsigned int biWidth; unsigned int biHeight; unsigned short int biPlanes; unsigned short int biBitCount; unsigned int biCompression; unsigned int biSizeImage; unsigned int biXPelsPerMeter; unsigned int biYPelsPerMeter; unsigned int biClrUsed; unsigned int biClrImportant;
BITMAPINFOHEADER() { biSize=0; biWidth=0; biHeight=0; biPlanes=0; biBitCount=0; biCompression=0; biSizeImage=0; biXPelsPerMeter=0; biYPelsPerMeter=0; biClrUsed=0; biClrImportant=0; }
void Show() { cout << dec << "biSize: " << biSize << endl; cout << dec << "biWidth: " << biWidth << endl; cout << dec << "biHeight: " << biHeight << endl; cout << dec << "biPlanes: " << biPlanes << endl; cout << dec << "biBitCount: " << biBitCount << endl; cout << dec << "biCompression: "<< biCompression << endl; cout << dec << "biSizeImage: " << biSizeImage << endl; cout << dec << "biXPelsPerMeter: " << biXPelsPerMeter << endl; cout << dec << "biYPelsPerMeter: " << biYPelsPerMeter << endl; cout << dec << "biClrUsed: " << biClrUsed << endl; cout << dec << "biClrImportant: " << biClrImportant << endl; }
void Read(ifstream* f) { (*f).read((char*)&biSize,4); (*f).read((char*)&biWidth,4); (*f).read((char*)&biHeight,4); (*f).read((char*)&biPlanes,2); (*f).read((char*)&biBitCount,2); (*f).read((char*)&biCompression,4); (*f).read((char*)&biSizeImage,4); (*f).read((char*)&biXPelsPerMeter,4); (*f).read((char*)&biYPelsPerMeter,4); (*f).read((char*)&biClrUsed,4); (*f).read((char*)&biClrImportant,4); }
};
|
main.cpp
| Код | #include <iostream> #include <fstream> #include "bmpheader.h" using namespace std;
int main(int argc, char* argv[]) { BITMAPFILEHEADER bfHead; BITMAPINFOHEADER biHead; ifstream bFile;
if(argc!=2){ cout << "|-----------------------------------------|"<< endl; cout << "| |"<< endl; cout << "| Error! Input file name in command line. |"<< endl << "| Example: lab1.exe bitmapfile.bmp |"<< endl; cout << "| |"<< endl; cout << "|-----------------------------------------|"<< endl; return 1; }
bFile.open(argv[1],ios::binary); bfHead.Read(&bFile); cout<<"------------BITMAPFILEHEADER------------"<<endl; bfHead.Show(); biHead.Read(&bFile); cout<<"------------BITMAPINFOHEADER------------"<<endl; biHead.Show();
unsigned long temp[3]; temp[3]='\0';
bFile.close();
return 0; }
| |