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

📄 tuxianghechengdib.cpp

📁 基于VC++的图像合成,包括差影法和逻辑运算.
💻 CPP
📖 第 1 页 / 共 2 页
字号:
					p_temp1[DibWidth*j+i]=255;
			}
		}
        memcpy(p_data, p_temp1,DibWidth*height);   //复制处理后的图像
		delete  []p_temp1;
		delete  []p_temp2;
	}
}



///***************************************************************/           
/*函数名称:Feiyunsuan()                                        
/*函数类型:void                                   
/*功能:对图像进行非运算。            
/***************************************************************/ 
void TuXiangHeChengDib::Feiyunsuan()
{
	int i,j;  //循环变量
	BYTE* p_data;//图像指针
	int wide,height;  //原图的高和宽
	p_data=GetData();
    if (m_pBitmapInfoHeader->biBitCount<9)//灰度图像	    
	   wide=GetWidth();
	else//24位真彩色
	   wide=GetDibWidthBytes();
	height=GetHeight();
	LPBYTE p_temp1=new BYTE[wide*height]; //新图像缓冲区         
	memset(p_temp1,0,wide*height); //初始化为0
	//对原图二值化
	for(j=0;j<height;j++)
	{
		for(i=0;i<wide;i++)
		{
				if(p_data[wide*j+i]>128)
				p_temp1[wide*j+i]=1; 
		}
	}
 
	//进行每个像素的与运算
    for(j=1;j<height-1;j++)
	{
		for(i=1;i<wide-1;i++)
		{   
				if(p_temp1[wide*j+i]==0 )
				 p_temp1[wide*j+i]=255;
				else 
				 p_temp1[wide*j+i]=0;
		}
	}
    memcpy(p_data,p_temp1,wide*height);   //复制处理后的图像
	delete p_temp1;
}



///***************************************************************/           
/*函数名称:Huofei(LPBYTE p_data, LPBYTE p_dataBK,int wide,int height)                                        
/*函数类型:void 
/*参数说明:p_data       原图像首地址
/*          p_dataBK     背景图像首地址
/*          wide,height 原图像的高和宽                                   
/*功能:对图像进行或非运算。            
/***************************************************************/ 
void TuXiangHeChengDib::Huofei(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]=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=3;i<DibWidth-3;i++)
			{   
				if( p_temp2[DibWidth*j+i]==0&& p_temp1[DibWidth*j+i]==0)
					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;
	}
}



///***************************************************************/           
/*函数名称:Yufei(LPBYTE p_data, LPBYTE p_dataBK,int wide,int height)                                        
/*函数类型:void 
/*参数说明:p_data       原图像首地址
/*          p_dataBK     背景图像首地址
/*          wide,height 原图像的高和宽                                   
/*功能:对图像进行与非运算。            
/***************************************************************/
void TuXiangHeChengDib::Yufei(LPBYTE p_data, LPBYTE p_dataBK, int wide, int height)
{
	if (m_pBitmapInfoHeader->biBitCount<9)//灰度图像
	{
		int i,j;  //循环变量		 
		PBYTE  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]=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=3;i<DibWidth-3;i++)
			{   
				if( p_temp2[wide*j+i]==1&& p_temp1[DibWidth*j+i]==1)
					p_temp1[DibWidth*j+i]=0;
				else 
					p_temp1[DibWidth*j+i]=255;
			}
		}
		memcpy(p_data, p_temp1,DibWidth*height);   //复制处理后的图像
		delete  []p_temp1;
		delete  []p_temp2;
	}
}


///***************************************************************/           
/*函数名称:Yihuo(LPBYTE p_data, LPBYTE p_dataBK,int wide,int height)                                        
/*函数类型:void 
/*参数说明:p_data       原图像首地址
/*          p_dataBK     背景图像首地址
/*          wide,height 原图像的高和宽                                   
/*功能:对图像进行异或运算。            
/***************************************************************/
void TuXiangHeChengDib::Yihuo(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]+ 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=3;i<DibWidth-3;i++)
			{   
				if( p_temp2[DibWidth*j+i]+ 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;
	}
}

⌨️ 快捷键说明

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