读写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文件结构和数据的读写。
浙公网安备 33010602011771号