• 大小: 3KB
    文件类型: .rar
    金币: 1
    下载: 0 次
    发布日期: 2021-06-13
  • 语言: C/C++
  • 标签: BMP  图片  C++  

资源简介

BMP图像文件读写操作类,C++实现,支持24位位图。适合学习用。

资源截图

代码片段和文件信息

//---------------------------------------------------------------------------

#pragma hdrstop

#include “BMPHelper.h“
//---------------------------------------------------------------------------
#pragma package(smart_init)
//---------------------------------------------------------------------------

TBMPHelper::TBMPHelper(void)
{
InitBMPFile();
}
//---------------------------------------------------------------------------

TBMPHelper::~TBMPHelper(void)
{
if(NULL != m_BMPFile->BMPData)
{
delete []m_BMPFile->BMPData;
m_BMPFile->BMPData = NULL;
}

delete m_BMPFile;
}
//---------------------------------------------------------------------------

void TBMPHelper::InitBMPFile(void)
{
    m_BMPFile = new BITMAPFILE;
memset(&(m_BMPFile->FileHeader) 0 sizeof(m_BMPFile->FileHeader));
memset(&(m_BMPFile->InfoHeader) 0 sizeof(m_BMPFile->InfoHeader));
m_BMPFile->BMPData = NULL;

m_RealImageWidth    = 0;
m_RealImageHeight   = 0;
m_RealImageDataSize = 0;
}
//---------------------------------------------------------------------------

int TBMPHelper::OpenBMPFile(const wchar_t* wszFileName)
{
    wchar_t wszOpenMode[] = {‘r‘‘b‘};
FILE *pFile = _wfopen(wszFileName wszOpenMode);
if(NULL == pFile)
    {
return 1;
}

// 加载位图文件头
fseek(pFile 0 SEEK_SET);
fread(&(m_BMPFile->FileHeader) sizeof(m_BMPFile->FileHeader) 1 pFile);

// 不是有效的BMP位图文件
if(0x4d42 != m_BMPFile->FileHeader.bfType)
{
fclose(pFile);
return 2;
    }

// 加载位图信息头
fseek(pFile sizeof(m_BMPFile->FileHeader) SEEK_SET);
fread(&(m_BMPFile->InfoHeader) sizeof(m_BMPFile->InfoHeader) 1 pFile);

// 仅支持24位真彩色图像
if(24 != m_BMPFile->InfoHeader.biBitCount)
{
fclose(pFile);
return 3;
}

// 计算位图数据大小,这里计算数据需要检测高度值的正负性
m_RealImageWidth   = m_BMPFile->InfoHeader.biWidth;
m_RealImageHeight  = m_BMPFile->InfoHeader.biHeight > 0 ? m_BMPFile->InfoHeader.biHeight : -(m_BMPFile->InfoHeader.biHeight);
WORD BitsPerPixel = m_BMPFile->InfoHeader.biBitCount;

DWORD LineByteCnt = (m_RealImageWidth*BitsPerPixel)/8;

m_RealImageDataSize = LineByteCnt*m_RealImageHeight;
m_BMPFile->BMPData = new BYTE[m_RealImageDataSize];

fseek(pFile m_BMPFile->FileHeader.bfOffBits SEEK_SET);

// 不需要四字节对齐处理
if(0 == LineByteCnt%4)
{
// 加载位图数据
fread(m_BMPFile->BMPData m_RealImageDataSize 1 pFile);
}
else
{
BYTE *WTDataBuf = m_BMPFile->BMPData;
LONG WTSize = 3*m_RealImageWidth;
int FillOffset = 4 - LineByteCnt%4;

for(int iY=0; iY {
// 加载位图数据
fread(WTDataBuf WTSize 1 pFile);
WTDataBuf += WTSize;
fseek(pFile FillOffset SEEK_CUR);
}
}

fclose(pFile);

return 0;
}
//---------------------------------------------------------------------------

int TBMPHelper::SaveToBMPFile(const wchar_t* wszFileName)
{
if(NULL == m_BMPFile->BMPData)
{
return 1;
}

wchar_t wszOpenMode[] = {‘w‘‘b‘};
FILE *pFile = _wfope

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件       5195  2017-10-21 09:52  BMPHelper\BMPHelper.cpp

     文件       3188  2017-11-04 22:57  BMPHelper\BMPHelper.h

     目录          0  2017-10-21 10:00  BMPHelper

----------- ---------  ---------- -----  ----

                 8383                    3


评论

共有 条评论