资源简介
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
相关资源
- C++头文件转delphi工具 + 源码
- 国际象棋的qt源代码
- C++中头文件与源文件的作用详解
- C++多线程网络编程Socket
- VC++ 多线程文件读写操作
- 利用C++哈希表的方法实现电话号码查
- 移木块游戏,可以自编自玩,vc6.0编写
- C++纯文字DOS超小RPG游戏
- 将图片转换为C语言数组的程序
- VC++MFC小游戏实例教程(实例)+MFC类库
- 连铸温度场计算程序(C++)
- 6自由度机器人运动学正反解C++程序
- Em算法(使用C++编写)
- libstdc++-4.4.7-4.el6.i686.rpm
- VC++实现CMD命令执行与获得返回信息
- 白话C++(全)
- C++标准库第1、2
- 大数类c++大数类
- C++语言编写串口调试助手
- c++素数筛选法
- C++ mqtt 用法
- 商品库存管理系统 C++ MFC
- c++ 多功能计算器
- C++17 In Detail
- 嵌入式QtC++编程课件
- 颜色识别形状识别STM103嵌入式代码
- c++ 邮件多附件群发
- c++ 透明代理(hookproxy)
- mfc 调用redis
- FTP客户端源码(c++)
川公网安备 51152502000135号
评论
共有 条评论