📄 bmpobject.cpp
字号:
// BmpObject.cpp: implementation of the CBmpObject class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "pdf417.h"
#include "BmpObject.h"
//#include "vfw.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CBmpObject::CBmpObject()
{
lpFileBuffer = NULL;
}
CBmpObject::~CBmpObject()
{
//如果所申请的区域不为空,则删除
if(this->lpFileBuffer != NULL)
delete[] lpFileBuffer;
}
BOOL CBmpObject::ReadBmpFile(CString& BmpFileName)
{
if(BmpFileName.GetLength() == 0) return FALSE;
CFile f;
CFileException e;
DWORD sizeofBmpFile; //文件长度
BITMAPFILEHEADER* bf; //文件头指针
UINT dColorsNum; //图像颜色数
//打开文件
if(!f.Open(BmpFileName,CFile::modeRead,&e))
{
AfxMessageBox("不能打开文件!");
return FALSE;
}
sizeofBmpFile = f.GetLength();
//申请缓冲区存放数据,此缓冲区在对象析构时销毁
this->lpFileBuffer = new UCHAR[sizeofBmpFile];
ASSERT(lpFileBuffer);
//读入文件数据后关闭文件
f.Read(this->lpFileBuffer,sizeofBmpFile);
f.Close();
//得到文件头指针
bf = (BITMAPFILEHEADER*)(this->lpFileBuffer);
if(!(lpFileBuffer[0]=='B'&&lpFileBuffer[1]=='M'))
{
delete[] lpFileBuffer;
lpFileBuffer = NULL;
AfxMessageBox("此文件不是BMP图形文件!",MB_ICONEXCLAMATION);
return FALSE;
}
//得到数据信息头指针
bi = (BITMAPINFOHEADER*)(this->lpFileBuffer+sizeof(BITMAPFILEHEADER));
//BMP图像数据区域指针
this->lpBmpData = this->lpFileBuffer+bf->bfOffBits;
//设置宽度及高度
this->dImageWidth = bi->biWidth;
this->dImageHeight = bi->biHeight;
this->dBitCounts = bi->biBitCount;
//判断数据位是否为1,4,8,如不是,则提示用户,并清缓冲区后返回
if(dBitCounts!=1 && dBitCounts!=4 && dBitCounts!=8)
{
AfxMessageBox(IDS_ERRFILESTYLE,MB_ICONEXCLAMATION);
delete[] lpFileBuffer;
lpFileBuffer = NULL;
return false;
}
//一行数据的长度
this->dBytesPerLine = (((DWORD)dImageWidth*dBitCounts+31)/32)*4;
//颜色表地址
this->lpColorData = (RGBQUAD*)(lpFileBuffer+sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER));
//颜色项多少
dColorsNum=0;
if(dBitCounts!=24)
dColorsNum = (1<<dBitCounts);
if(dColorsNum<bi->biClrUsed)
dColorsNum = bi->biClrUsed;
return TRUE;
}
//对BMP数据进行反转
void CBmpObject::BmpDataReverse()
{
UCHAR* tmp=new UCHAR[this->dBytesPerLine];
for(UINT i=0;i<dImageHeight/2;i++)
{
if(i!=dImageHeight-1-i)
{
memcpy(tmp,&(lpBmpData[dBytesPerLine*i]),dBytesPerLine);
memcpy(&(lpBmpData[dBytesPerLine*i]),
&(lpBmpData[dBytesPerLine*(dImageHeight-1-i)]),
dBytesPerLine);
memcpy(&(lpBmpData[dBytesPerLine*(dImageHeight-1-i)]),tmp,dBytesPerLine);
}
}
delete[] tmp;
}
//得到一个点的值
BYTE CBmpObject::GetPointValue(UINT x, UINT y)
{
UCHAR tmp;
switch(dBitCounts)
{
case 1:
tmp = this->lpBmpData[y*this->dBytesPerLine+x/8];
if(tmp&(0x80>>x%8)) return 1;
else return 0;
case 4:
tmp = this->lpBmpData[y*this->dBytesPerLine+x/2];
if(x%2) return tmp&0x0f;
else return (tmp>>4)&0x0f;
case 8:
tmp = this->lpBmpData[y*this->dBytesPerLine+x];
return tmp;
default:
AfxMessageBox(IDS_ERRFILESTYLE,MB_ICONEXCLAMATION);
return 0;
}
}
//判断一点是否为BLACK色
//根据点的RGB值是否为(0,0,0)
BOOL CBmpObject::IsBlack(UINT x, UINT y)
{
if(dBitCounts <=8)
{
RGBQUAD tmp = lpColorData[this->GetPointValue(x,y)];
return (tmp.rgbBlue+tmp.rgbGreen+tmp.rgbRed==0);
}
else return false;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -