读写BMP文件
BMP文件是windows常用文件,一般不压缩,直接读出/保存RGB原图数据,具有一定意义。这里给出源代码,提供参考。
头文件
#ifndef BmpFileH #define BmpFileH #include "..\Drive\ApiFile\ApiFile.h" class CBmpFile { public: WORD wImgWidth, //图像宽度 wImgHeight;//图像高度 DWORD dwImgLength;//图像数据数据长度 bool Open(String sFileName);//打开文件 void ReadData(BYTE *pImg); // 读数据 bool Create(String sFileName); // 创建文件 void WriteData(BYTE *pImg); // 写数据 void Close(void); // 关闭文件 private: CApiFile RFile,WFile;//引用读写文件 BITMAPFILEHEADER Head;//文件头结构 BITMAPINFOHEADER Info;//信息头结构 }; #endif
实现文件
#include "BmpFile.h"
bool CBmpFile::Open(String sFileName) // 打开文件
{
if(!RFile.OpenR(sFileName)) return false;
// 读文件头及信息
if(!RFile.Read(&Head, sizeof(BITMAPFILEHEADER))) return false;
if(!RFile.Read(&Info, sizeof(BITMAPINFOHEADER))) return false;
// 传递文件尺寸
wImgWidth = (WORD)Info.biWidth;
wImgHeight = (WORD)Info.biHeight;
dwImgLength = Info.biSizeImage;
return true;
}
void CBmpFile::ReadData(BYTE *pImg) // 读数据
{
RFile.Read(pImg, Info.biSizeImage); // 读出数据
}
bool CBmpFile::Create(String sFileName) // 创建文件
{
if(!WFile.Create(sFileName)) return false;
// 文件头
Head.bfType = 0x4D42;//文件标志
Head.bfSize = 0;//文件总大小,字节
Head.bfReserved1 = 0;//保留1
Head.bfReserved2 = 0;//保留2
Head.bfOffBits = 54;//文件数据偏移处
WFile.Write(&Head, sizeof(BITMAPFILEHEADER));
// 文件信息
Info.biSize = 40;//结构体大小
Info.biWidth = wImgWidth;//图像宽度
Info.biHeight = wImgHeight;//图像高度
Info.biPlanes = 1;//颜色平面数
Info.biBitCount = 24;//24位色彩数
Info.biCompression = BI_RGB;//无压缩 = 0
Info.biSizeImage = wImgWidth * wImgHeight * 3;
Info.biXPelsPerMeter = 0;
Info.biYPelsPerMeter = 0;
Info.biClrUsed = 0;
Info.biClrImportant = 0;
WFile.Write(&Info, sizeof(BITMAPINFOHEADER));
return true;
}
void CBmpFile::WriteData(BYTE *pImg) // 写数据
{
WFile.Write(pImg, Info.biSizeImage);
}
void CBmpFile::Close(void) // 关闭文件
{
RFile.Close();
WFile.Close();
}
由两个类实现,CApiFile请参考我的《API读写32位系统4G以上大文件》一文,将系统API封装为一个类,名称为CApiFile,派生两个对象,分别读写文件。实现BMP文件的读写也封装了一个类,实现对BMP文件结构和数据的读写。