⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mybitmap.cpp

📁 本人自己编写的数字图像处理
💻 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 + -