读写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文件结构和数据的读写。

 

posted @ 2018-09-26 13:56  hbg200  阅读(174)  评论(0编辑  收藏  举报