?? tuxianghechengdib.cpp
字號:
#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 + -