📄 mybitmap.cpp
字号:
#include "stdafx.h"
#include "MyBitmap.h"
#include <memory.h>
IMPLEMENT_DYNAMIC(CBitmapFile,CObject)
CBitmapFile::CBitmapFile()
{
lpBitmapInfo=NULL;
lpBitmapData=NULL;
}
BOOL CBitmapFile::LoadBitmap(LPCTSTR lpszFileName)//加载BMP文件
{
CFile file;
if(!file.Open(lpszFileName,CFile::modeRead|CFile::shareDenyWrite))
{
MessageBox(NULL,"BMP文件打开错误!","系统提示",MB_OK);
return FALSE;
}
//读位图文件头
BITMAPFILEHEADER bfhHeader;
file.Read(&bfhHeader,sizeof(BITMAPFILEHEADER));
if(bfhHeader.bfType!=((WORD)('M'<<8)|'B'))
{
MessageBox(NULL,"该文件不是BMP文件!","系统提示",MB_OK);
return FALSE;
}
if(bfhHeader.bfSize!=file.GetLength())
{
MessageBox(NULL,"BMP 文件头有错误!","系统提示",MB_OK);
return FALSE;
}
//读位图信息块
UINT uBmpInfoLen=(UINT)bfhHeader.bfOffBits-sizeof(BITMAPFILEHEADER);
lpBitmapInfo=(LPBITMAPINFO)new BYTE[uBmpInfoLen];
file.Read((LPVOID)lpBitmapInfo,uBmpInfoLen);
if((*(LPDWORD)(lpBitmapInfo))!=sizeof(BITMAPINFOHEADER))
{
MessageBox(NULL,"BMP不是Windows 3.0格式!","系统提示",MB_OK);
delete[] lpBitmapInfo;
return FALSE;
}
//读位图数据
DWORD dwBitlen=bfhHeader.bfSize-bfhHeader.bfOffBits;
lpBitmapData=new BYTE[dwBitlen];
if (!lpBitmapData)
return FALSE;
if (file.ReadHuge(lpBitmapData,dwBitlen)!=dwBitlen)
{
MessageBox(NULL,"读位图数据错误!","系统提示",MB_OK);
delete[] lpBitmapInfo;
delete[] lpBitmapData;
return FALSE;
}
file.Close();
return TRUE;
}
//获取颜色数
int CBitmapFile::GetColorNumber(WORD wBitCount)
{
ASSERT(wBitCount==1||wBitCount==4||wBitCount==8||wBitCount==16||
wBitCount==24||wBitCount==32);
switch(wBitCount)
{
case 1:
return 2;break;
case 4:
return 16;break;
case 8:
return 256;break;
default:
return 0;break;
}
}
//获取位图信息指针
LPBITMAPINFO CBitmapFile::GetBitmapInfo()
{
return lpBitmapInfo;
}
//获取位图数据指针
LPBYTE CBitmapFile::GetBitmapData()
{
return lpBitmapData;
}
//获取位图宽度
LONG CBitmapFile::GetBitmapWidth()
{
m_lBitmapWidth=lpBitmapInfo->bmiHeader.biWidth;
return m_lBitmapWidth;
}
//获取位图高度
LONG CBitmapFile::GetBitmapHeight()
{
m_lBitmapHeight=lpBitmapInfo->bmiHeader.biHeight;
return m_lBitmapHeight;
}
//线性变换
void CBitmapFile::LinearTransformation(LPBYTE lpSrcData,LPBITMAPINFO lpSrcInfo,LONG SrcWidth,LONG SrcHeight)
{
LONG i,j;
m_lBytePerLine=(lpSrcInfo->bmiHeader.biWidth*lpSrcInfo->bmiHeader.biBitCount+31)/32*4;
for(i=0;i<SrcHeight;i++)
{
for(j=0;j<SrcWidth;j++)
{
BYTE *lpDes=lpSrcData+m_lBytePerLine*(SrcHeight-i-1)+3*j;
*lpDes=2*(*lpDes)-1;
*(lpDes+1)=2*(*(lpDes+1))-1;
*(lpDes+2)=2*(*(lpDes+2))-1;
if(*lpDes<0)
*lpDes=0;
else if(*lpDes>255)
*lpDes=255;
else *lpDes=*lpDes;
if(*(lpDes+1)<0)
*(lpDes+1)=0;
else if(*(lpDes+1)>255)
*(lpDes+1)=255;
else *(lpDes+1)=*(lpDes+1);
if(*(lpDes+2)<0)
*(lpDes+2)=0;
else if(*(lpDes+2)>255)
*(lpDes+2)=255;
else *(lpDes+2)=*(lpDes+2);
}
}
}
void CBitmapFile::Lapuls(LPBYTE lpSrcData,LPBITMAPINFO lpSrcInfo,LONG SrcWidth,LONG SrcHeight)
{
BYTE *lp1,*lp2,*lp3,*lp4;
BYTE red[4],green[4],blue[4];
BYTE r,g,b;
LONG i,j;
m_lBytePerLine=(lpSrcInfo->bmiHeader.biWidth*lpSrcInfo->bmiHeader.biBitCount+31)/32*4;
for(i=0;i<SrcHeight;i++)
{
for(j=0;j<SrcWidth;j++)
{
BYTE *lpDes=lpSrcData+m_lBytePerLine*(SrcHeight-i-1)+3*j;
if(i==0||j==0||i==SrcHeight||j==SrcWidth)
{
*lpDes=*lpDes;
*(lpDes+1)=*(lpDes+1);
*(lpDes+2)=*(lpDes+2);
}
else
{
lp1=lpSrcData+m_lBytePerLine*(SrcHeight-i-1-1)+3*j;
lp2=lpSrcData+m_lBytePerLine*(SrcHeight-i-1+1)+3*j;
lp3=lpSrcData+m_lBytePerLine*(SrcHeight-i-1)+3*(j-1);
lp4=lpSrcData+m_lBytePerLine*(SrcHeight-i-1)+3*(j+1);
red[0]=*lp1;
red[1]=*lp2;
red[2]=*lp3;
red[3]=*lp4;
green[0]=*(lp1+1);
green[1]=*(lp2+1);
green[2]=*(lp3+1);
green[3]=*(lp4+1);
blue[0]=*(lp1+2);
blue[1]=*(lp2+2);
blue[2]=*(lp3+2);
blue[3]=*(lp4+2);
r=abs(red[0]+red[1]+red[2]+red[3]-4*(*lpDes));
g=abs(green[0]+green[1]+green[2]+green[3]-4*(*(lpDes+1)));
b=abs(blue[0]+blue[1]+blue[2]+blue[3]-4*(*(lpDes+2)));
*lpDes=r;
*(lpDes+1)=g;
*(lpDes+2)=b;
if(*lpDes>50)
*lpDes=0;
else *lpDes=255;
if(*(lpDes+1)>50)
*(lpDes+1)=0;
else *(lpDes+1)=255;
if(*(lpDes+2)>50)
*(lpDes+2)=0;
else *(lpDes+2)=255;
}
}
}
}
void CBitmapFile::Soble(LPBYTE lpSrcData,LPBITMAPINFO lpSrcInfo,LONG SrcWidth,LONG SrcHeight)
{
BYTE *lp1,*lp2,*lp3,*lp4,*lp5,*lp6,*lp7,*lp8;
BYTE red[8],green[8],blue[8];
BYTE r,g,b;
LONG i,j;
m_lBytePerLine=(lpSrcInfo->bmiHeader.biWidth*lpSrcInfo->bmiHeader.biBitCount+31)/32*4;
for(i=0;i<SrcHeight;i++)
{
for(j=0;j<SrcWidth;j++)
{
BYTE *lpDes=lpSrcData+m_lBytePerLine*(SrcHeight-i-1)+3*j;
if(i==0||j==0||i==SrcHeight||j==SrcWidth)
{
*lpDes=*lpDes;
*(lpDes+1)=*(lpDes+1);
*(lpDes+2)=*(lpDes+2);
}
else
{
lp1=lpSrcData+m_lBytePerLine*(SrcHeight-i-1-1)+3*j;
lp2=lpSrcData+m_lBytePerLine*(SrcHeight-i-1-1)+3*(j-1);
lp3=lpSrcData+m_lBytePerLine*(SrcHeight-i-1-1)+3*(j+1);
lp4=lpSrcData+m_lBytePerLine*(SrcHeight-i-1+1)+3*j;
lp5=lpSrcData+m_lBytePerLine*(SrcHeight-i-1+1)+3*(j-1);
lp6=lpSrcData+m_lBytePerLine*(SrcHeight-i-1+1)+3*(j+1);
lp7=lpSrcData+m_lBytePerLine*(SrcHeight-i-1)+3*(j-1);
lp8=lpSrcData+m_lBytePerLine*(SrcHeight-i-1)+3*(j+1);
red[0]=*lp1;
red[1]=*lp2;
red[2]=*lp3;
red[3]=*lp4;
red[4]=*lp5;
red[5]=*lp6;
red[6]=*lp7;
red[7]=*lp8;
green[0]=*(lp1+1);
green[1]=*(lp2+1);
green[2]=*(lp3+1);
green[3]=*(lp4+1);
green[4]=*(lp5+1);
green[5]=*(lp6+1);
green[6]=*(lp7+1);
green[7]=*(lp8+1);
blue[0]=*(lp1+2);
blue[1]=*(lp2+2);
blue[2]=*(lp3+2);
blue[3]=*(lp4+2);
blue[4]=*(lp5+2);
blue[5]=*(lp6+2);
blue[6]=*(lp7+2);
blue[7]=*(lp8+2);
r=abs((red[2]+2*red[7]+red[5])-(red[1]+2*red[6]+red[4]))+
abs((red[1]+2*red[0]+red[2])-(red[4]+2*red[3]+red[5]));
g=abs((green[2]+2*green[7]+green[5])-(green[1]+2*green[6]+green[4]))+
abs((green[1]+2*green[0]+red[2])-(green[4]+2*green[3]+green[5]));
b=abs((blue[2]+2*blue[7]+blue[5])-(blue[1]+2*blue[6]+blue[4]))+
abs((blue[1]+2*blue[0]+blue[2])-(blue[4]+2*blue[3]+blue[5]));
*lpDes=r;
*(lpDes+1)=g;
*(lpDes+2)=b;
if(*lpDes>50)
*lpDes=0;
else *lpDes=255;
if(*(lpDes+1)>50)
*(lpDes+1)=0;
else *(lpDes+1)=255;
if(*(lpDes+2)>50)
*(lpDes+2)=0;
else *(lpDes+2)=255;
}
}
}
}
void CBitmapFile::Regionsegadaptive(LPBYTE lpSrcData,LPBITMAPINFO lpSrcInfo,LONG SrcWidth,LONG SrcHeight)
{
LONG i,j;
int sum=0;
int average=0;
BYTE Thr;//阈值
BYTE *lp0,*lp1,*lp2,*lp3,*lp4,*lp5,*lp6,*lp7;
int max=0,min=0;
m_lBytePerLine=(lpSrcInfo->bmiHeader.biWidth*lpSrcInfo->bmiHeader.biBitCount+31)/32*4;
for(i=0;i<SrcHeight;i++)
{
for(j=0;j<SrcWidth;j++)
{
BYTE *lpDes=lpSrcData+m_lBytePerLine*(SrcHeight-i-1)+j;
sum+=(*lpDes);
}
}
for(i=0;i<SrcHeight;i++)
{
for(j=0;j<SrcWidth;j++)
{
BYTE *lpDes=lpSrcData+m_lBytePerLine*(SrcHeight-i-1)+j;
if(i==0||j==0||i==SrcHeight-1||j==SrcWidth-1){
average=sum/(SrcHeight*SrcWidth);
Thr=average;}//像素均值
else{
lp0=lpSrcData+m_lBytePerLine*(SrcHeight-i-1-1)+j;
lp1=lpSrcData+m_lBytePerLine*(SrcHeight-i-1-1)+(j-1);
lp2=lpSrcData+m_lBytePerLine*(SrcHeight-i-1-1)+(j+1);
lp3=lpSrcData+m_lBytePerLine*(SrcHeight-i-1+1)+j;
lp4=lpSrcData+m_lBytePerLine*(SrcHeight-i-1+1)+(j-1);
lp5=lpSrcData+m_lBytePerLine*(SrcHeight-i-1+1)+(j+1);
lp6=lpSrcData+m_lBytePerLine*(SrcHeight-i-1)+(j-1);
lp7=lpSrcData+m_lBytePerLine*(SrcHeight-i-1)+(j+1);
max=(*lp0>max)?*lp0:max;
max=(*lp1>max)?*lp1:max;
max=(*lp2>max)?*lp2:max;
max=(*lp3>max)?*lp3:max;
max=(*lp4>max)?*lp4:max;
max=(*lp5>max)?*lp5:max;
max=(*lp6>max)?*lp6:max;
max=(*lp7>max)?*lp7:max;
min=(*lp0<min)?*lp0:min;
min=(*lp1<min)?*lp1:min;
min=(*lp2<min)?*lp2:min;
min=(*lp3<min)?*lp3:min;
min=(*lp4<min)?*lp4:min;
min=(*lp5<min)?*lp5:min;
min=(*lp6<min)?*lp6:min;
min=(*lp7<min)?*lp7:min;
average=(max+min)/2;
Thr=average;}//八邻域最值均值
if(*lpDes<Thr)
*lpDes=0;
else
{
*lpDes=255;
}
}
}
}
CBitmapFile::~CBitmapFile()
{
if(lpBitmapInfo)
delete[] lpBitmapInfo;
if(lpBitmapData)
delete[] lpBitmapData;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -