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

📄 tuxianghechengdib.cpp

📁 to perform image he cheng
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include "stdafx.h"
#include "windowsx.h"
#include "math.h"
#include "TuXiangHeChengDib.h"
#include "MainFrm.h"
#include "DynSplitView2.h"

 
 
TuXiangHeChengDib::TuXiangHeChengDib()
{
	bool m_valid=true;
}
TuXiangHeChengDib::~TuXiangHeChengDib()
{
}



///***************************************************************/           
/*函数名称:Add(LPBYTE p_data, LPBYTE p_dataBK,int wide,int height)                                        
/*函数类型:void 
/*参数说明:p_data       原图像首地址
/*          p_dataBK     背景图像首地址
/*          wide,height 原图像的高和宽                                   
/*功能:对图像进行加运算。            
/***************************************************************/ 
void TuXiangHeChengDib::Add(LPBYTE p_data, LPBYTE p_dataBK,int wide,int height)
{
	LPBYTE lpSrc;  //原图像像素指针
    LPBYTE lpDst;   //目标像素指针
    LPBYTE lpSrcBK;  //背景像素指针	
	if (m_pBitmapInfoHeader->biBitCount<9)//灰度图像
	{
		int i,j;  //循环变量
		LPBYTE  temp=new BYTE[wide*height];    //新图像缓冲区
		//初始化新分配的内存为255
		memset(temp,255,wide*height);			
		//进行每个像素的加运算
		for(j=1;j<height-1;j++)
		{
			for(i=1;i<wide-1;i++)
			{
				//获得原像素指针
				lpSrc=p_data+wide*j+i;
				//获得目标像素指针
				lpDst=temp+wide*j+i;
				//获得背景像素指针
				lpSrcBK=p_dataBK+wide*j+i;
				//进行加运算
				if((*lpSrc+*lpSrcBK)>255)
					*lpDst=255;
				else
					*lpDst=(*lpSrc+*lpSrcBK);
			}
		}
		memcpy(p_data, temp,wide*height);   //复制处理后的图像
		delete  temp;
	}
	else //24位真彩色
	{
		LONG wide,height,DibWidth;    //原图长、宽
		p_data=this->GetData ();   //取得原图的数据区指针
		wide=this->GetWidth ();  //取得原图的数据区宽度
		height=this->GetHeight ();   //取得原图的数据区高度
		DibWidth=this->GetDibWidthBytes();   //取得原图的每行字节数
		BYTE *p_temp=new BYTE[height*DibWidth];
		//进行每个像素的加运算
		for(int j=1;j<height-1;j++)
		{
			for(int i=3;i<DibWidth-3;i++)
			{
				//获得原像素指针
				lpSrc=p_data+DibWidth*j+i;
				//获得目标像素指针
				lpDst=p_temp+DibWidth*j+i;
				//获得背景像素指针
				lpSrcBK=p_dataBK+DibWidth*j+i;
				//进行加运算
				if((*lpSrc+*lpSrcBK)>255)
					*lpDst=255;
				else
					*lpDst=(*lpSrc+*lpSrcBK);
			}
		}
		memcpy(p_data, p_temp,DibWidth*height);   //复制处理后的图像
		delete  []p_temp;
	}	
}



///***************************************************************/           
/*函数名称:Sub(LPBYTE p_data, LPBYTE p_dataBK,int wide,int height)                                        
/*函数类型:void 
/*参数说明:p_data       原图像首地址
/*          p_dataBK     背景图像首地址
/*          wide,height 原图像的高和宽                                   
/*功能:对图像进行减运算。            
/***************************************************************/ 
void TuXiangHeChengDib::Sub(LPBYTE p_data, LPBYTE p_dataBK, int wide, int height)
{
	LPBYTE lpSrc;  //原图像像素指针
    LPBYTE lpDst;   //目标像素指针
    LPBYTE lpSrcBK;  //背景像素指针
    if (m_pBitmapInfoHeader->biBitCount<9)//灰度图像
	{
		int i,j;  //循环变量
		LPBYTE  temp=new BYTE[wide*height];    //新图像缓冲区
		//初始化新分配的内存为255
		memset(temp,255,wide*height);	
		//进行每个像素的减运算
		for(j=1;j<height-1;j++)
		{
			for(i=1;i<wide-1;i++)
			{
				//获得原像素指针
				lpSrc=p_data+wide*j+i;
				//获得目标像素指针
				lpDst=temp+wide*j+i;
				//获得背景像素指针
				lpSrcBK=p_dataBK+wide*j+i;
				//进行减运算
				if((*lpSrc-*lpSrcBK)<0)
					*lpDst=0;
				else
					*lpDst=(*lpSrc-*lpSrcBK);
			}
		}
		memcpy(p_data, temp,wide*height);   //复制处理后的图像
		delete  temp;
	}
	else//24位真彩色
	{
		int wide,height,DibWidth;    //原图长、宽
		p_data=this->GetData ();   //取得原图的数据区指针
		wide=this->GetWidth ();  //取得原图的数据区宽度
		height=this->GetHeight ();   //取得原图的数据区高度
		DibWidth=this->GetDibWidthBytes();   //取得原图的每行字节数
		BYTE *p_temp=new BYTE[height*DibWidth];
		//进行每个像素的减运算
		for(int j=1;j<height-1;j++)
		{
			for(int i=1;i<DibWidth-1;i++)
			{
				//获得原像素指针
				lpSrc=p_data+DibWidth*j+i;
				//获得目标像素指针
				lpDst=p_temp+DibWidth*j+i;
				//获得背景像素指针
				lpSrcBK=p_dataBK+DibWidth*j+i;
				//进行减运算
				if((*lpSrc-*lpSrcBK)<0)
					*lpDst=0;
				else
					*lpDst=(*lpSrc-*lpSrcBK);
			}
		}
		memcpy(p_data, p_temp,DibWidth*height);   //复制处理后的图像
		delete  []p_temp;
	}
}



///***************************************************************/           
/*函数名称:Yuyunsuan(LPBYTE p_data, LPBYTE p_dataBK,int wide,int height)                                        
/*函数类型:void 
/*参数说明:p_data       原图像首地址
/*          p_dataBK     背景图像首地址
/*          wide,height 原图像的高和宽                                   
/*功能:对图像进行与运算。            
/***************************************************************/
void TuXiangHeChengDib::Yuyunsuan(LPBYTE p_data, LPBYTE p_dataBK, int wide, int height)
{
    if (m_pBitmapInfoHeader->biBitCount<9)//灰度图像
	{
		int i,j;  //循环变量 	 
		LPBYTE  temp1=new BYTE[wide*height]; //新图像缓冲区
		LPBYTE  temp2=new BYTE[wide*height]; 
		memset( temp1,0,wide*height);
		memset( temp2,0,wide*height);
		//对原图二值化
		for(j=0;j<height;j++)
		{
			for(i=0;i<wide;i++)
			{
				if(p_data[wide*j+i]>128)
					temp1[wide*j+i]=1; 
			}
		}
		//对背景二值化
		for(j=0;j<height;j++)
		{
			for(i=0;i<wide;i++)
			{
				if(p_dataBK[wide*j+i]>128)
					temp2[wide*j+i]=1; 
			}
		}
		//进行每个像素的与运算
		for(j=1;j<height-1;j++)
		{
			for(i=1;i<wide-1;i++)
			{   
				if( temp2[wide*j+i]==1&& temp1[wide*j+i]==1)
					temp1[wide*j+i]=255;
				else 
					temp1[wide*j+i]=0;
			}
		}
		memcpy(p_data, temp1,wide*height);   //复制处理后的图像
		delete  temp1;
		delete  temp2;
	}
	else//24位真彩色
	{
		int i,j;  //循环变量
		LPBYTE  p_data;     //原图数据区指针
		int wide,height,DibWidth;    //原图长、宽
		p_data=this->GetData ();   //取得原图的数据区指针
		wide=this->GetWidth ();  //取得原图的数据区宽度
		height=this->GetHeight ();   //取得原图的数据区高度
		DibWidth=this->GetDibWidthBytes();   //取得原图的每行字节数
		BYTE *p_temp1=new BYTE[height*DibWidth];
		BYTE *p_temp2=new BYTE[height*DibWidth];
		//对原图二值化
		for(j=0;j<height;j++)
		{
			for(i=0;i<DibWidth;i++)
			{
				if(p_data[DibWidth*j+i]>128)
					p_temp1[DibWidth*j+i]=1; 
			}
		}
		//对背景二值化
		for(j=0;j<height;j++)
		{
			for(i=0;i<DibWidth;i++)
			{
				if(p_dataBK[DibWidth*j+i]>128)
					p_temp2[DibWidth*j+i]=1; 
			}
		}
		//进行每个像素的与运算
		for(j=1;j<height-1;j++)
		{
			for(i=1;i<DibWidth-1;i++)
			{   
				if( p_temp2[DibWidth*j+i]==1&& p_temp1[DibWidth*j+i]==1)
					p_temp1[DibWidth*j+i]=255;
				else 
					p_temp1[DibWidth*j+i]=0;
			}
		}
		memcpy(p_data, p_temp1,DibWidth*height);   //复制处理后的图像
		delete  []p_temp1;
		delete  []p_temp2;
	}
}
///***************************************************************/           
/*函数名称:Huoyunsuan(LPBYTE p_data, LPBYTE p_dataBK,int wide,int height)                                        
/*函数类型:void 
/*参数说明:p_data       原图像首地址
/*          p_dataBK     背景图像首地址
/*          wide,height 原图像的高和宽                                   
/*功能:对图像进行或运算。            
/***************************************************************/ 
void TuXiangHeChengDib::Huoyunsuan(LPBYTE p_data, LPBYTE p_dataBK, int wide, int height)
{
    if (m_pBitmapInfoHeader->biBitCount<9)//灰度图像
	{
		int i,j;  //循环变量		 
		LPBYTE  temp1=new BYTE[wide*height]; //新图像缓冲区
		LPBYTE  temp2=new BYTE[wide*height]; 
		memset(temp1,0,wide*height);
		memset(temp2,0,wide*height);
		//对原图二值化
		for(j=0;j<height;j++)
		{
			for(i=0;i<wide;i++)
			{
				if(p_data[wide*j+i]>128)
					temp1[wide*j+i]=1; 
			}
		}
		//对背景二值化
		for(j=0;j<height;j++)
		{
			for(i=0;i<wide;i++)
			{
				if(p_dataBK[wide*j+i]>128)
					temp2[wide*j+i]=1; 
			}
		}
		//进行每个像素的与运算
		for(j=1;j<height-1;j++)
		{
			for(i=1;i<wide-1;i++)
			{   
				if( temp2[wide*j+i]==0&& temp1[wide*j+i]==0)
					temp1[wide*j+i]=0;
				else 
					temp1[wide*j+i]=255;
			}
		}
		memcpy(p_data, temp1,wide*height);   //复制处理后的图像
		delete  temp1;
		delete  temp2;
	}
	else//24位真彩色
	{
		int i,j;  //循环变量
		LPBYTE  p_data;     //原图数据区指针
		int wide,height,DibWidth;    //原图长、宽
		p_data=this->GetData ();   //取得原图的数据区指针
		wide=this->GetWidth ();  //取得原图的数据区宽度
		height=this->GetHeight ();   //取得原图的数据区高度
		DibWidth=this->GetDibWidthBytes();   //取得原图的每行字节数
		BYTE *p_temp1=new BYTE[height*DibWidth];
		BYTE *p_temp2=new BYTE[height*DibWidth];
		//对原图二值化
		for(j=0;j<height;j++)
		{
			for(i=0;i<DibWidth;i++)
			{
				if(p_data[DibWidth*j+i]>128)
					p_temp1[DibWidth*j+i]=1; 
			}
		}
		//对背景二值化
		for(j=0;j<height;j++)
		{
			for(i=0;i<DibWidth;i++)
			{
				if(p_dataBK[DibWidth*j+i]>128)
					p_temp2[DibWidth*j+i]=1; 
			}
		}
		//进行每个像素的与运算
		for(j=1;j<height-1;j++)
		{
			for(i=1;i<DibWidth-1;i++)
			{   
				if( p_temp2[DibWidth*j+i]==0&& p_temp1[DibWidth*j+i]==0)
					p_temp1[DibWidth*j+i]=0;
				else 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -