?? fushiyupengzhangdib.cpp
字號:
#include "stdafx.h"
#include "windowsx.h"
#include "math.h"
#include "FuShiYuPengZhangDib.h"
#include "MainFrm.h"
FuShiYuPengZhangDib::FuShiYuPengZhangDib()
{
}
FuShiYuPengZhangDib::~FuShiYuPengZhangDib()
{
}
///***************************************************************/
/*函數(shù)名稱:ChuiZhiFuShi()
/*函數(shù)類型:void
/*功能:對圖像進行垂直腐蝕。
/***************************************************************/
void FuShiYuPengZhangDib::ChuiZhiFuShi()
{
LPBYTE p_data; // 指向DIB象素指針
LPBYTE lpSrc;// 指向源圖像的指針
LPBYTE lpDst;// 指向緩存圖像的指針
LPBYTE temp;// 指向緩存DIB圖像的指針
int i;
int j;
int n;//循環(huán)變量
p_data = GetData();// 找到DIB圖像象素起始位置
LONG wide = GetWidth();// DIB的寬度
LONG height = GetHeight();// DIB的高度
if (m_pBitmapInfoHeader->biBitCount<9)//灰度圖像
{
temp = new BYTE[wide*height];// 暫時分配內(nèi)存,以保存新圖像
lpDst = (LPBYTE)temp;
memset(lpDst, (BYTE)255, wide * height);// 初始化新分配的內(nèi)存,設(shè)定初始值為255
//使用垂直方向的結(jié)構(gòu)元素進行腐蝕
for(j = 1; j < height - 1; j++)
{
for(i = 0; i < wide; i ++)
{
//由于使用3×1的結(jié)構(gòu)元素,為防止越界,所以不處理最上邊和最下邊的兩列像素
// 指向源圖像倒數(shù)第j行,第i個象素的指針
lpSrc = (unsigned char *)(p_data + wide * j + i);
lpDst = (unsigned char *)(temp + wide * j + i); // 指向目標圖像倒數(shù)第j行,第i個象素的指針
*lpDst = 0;//目標圖像中的當(dāng)前點先賦成黑色
// 如果源圖像中(0,-1)、(0,0)、(0,1)三個點之一有白點,
// 則將目標圖像中的(0,0)點賦成白色
for (n = 0; n < 3; n++)
{
if (*(lpSrc + (n - 1) * wide) > 128)
{
*lpDst = 255;
break;
}
}
}
}
// 復(fù)制腐蝕后的圖像
memcpy(p_data, temp, wide * height);
// 釋放內(nèi)存
delete temp;
}
else //24位真彩色
{
LONG DibWidth; //原圖長、寬
DibWidth=this->GetDibWidthBytes(); //取得原圖的每行字節(jié)數(shù)
BYTE *p_temp=new BYTE[height*DibWidth];
//使用垂直方向的結(jié)構(gòu)元素進行腐蝕
for(j = 1; j < height - 1; j++)
{
for(i = 0; i < DibWidth; i+=3)
{
//由于使用3×1的結(jié)構(gòu)元素,為防止越界,所以不處理最上邊和最下邊的兩列像素
// 指向源圖像倒數(shù)第j行,第i個象素的指針
lpSrc = (unsigned char *)(p_data + DibWidth * j + i);
lpDst = (unsigned char *)(p_temp + DibWidth * j + i); // 指向目標圖像倒數(shù)第j行,第i個象素的指針
*lpDst = 0;//目標圖像中的當(dāng)前點先賦成黑色
*(lpDst+1)=0;
*(lpDst+2)=0;
// 如果源圖像中(0,-1)、(0,0)、(0,1)三個點之一有白點,
// 則將目標圖像中的(0,0)點賦成白色
for(int m=0;m<3;m++)
{
for (n = 0; n < 3; n++)
{
if (*(lpSrc + (n - 1) * DibWidth) > 128)
{
*lpDst = 255;
break;
}
else
*lpDst =*lpSrc ;
}
lpSrc++;
lpDst++;
}
}
}
// 復(fù)制腐蝕后的圖像
memcpy(p_data, p_temp, DibWidth * height);
// 釋放內(nèi)存
delete []p_temp;
}
}
///***************************************************************/
/*函數(shù)名稱:Shuipingfushi()
/*函數(shù)類型:void
/*功能:對圖像進行水平腐蝕。
/***************************************************************/
void FuShiYuPengZhangDib::Shuipingfushi()
{
// 指向DIB象素指針
LPBYTE p_data;
// 指向源圖像的指針
LPBYTE lpSrc;
// 指向緩存圖像的指針
LPBYTE lpDst;
// 指向緩存DIB圖像的指針
LPBYTE temp;
//循環(huán)變量
int i;
int j;
int n;
// 找到DIB圖像象素起始位置
p_data = GetData();
// DIB的寬度
LONG wide = GetWidth();
// DIB的高度
LONG height = GetHeight();
if (m_pBitmapInfoHeader->biBitCount<9)//灰度圖像
{
// 暫時分配內(nèi)存,以保存新圖像
temp = new BYTE[wide*height];
// 初始化新分配的內(nèi)存,設(shè)定初始值為255
lpDst = (LPBYTE)temp;
memset(lpDst, (BYTE)255, wide * height);
// 使用水平方向的結(jié)構(gòu)元素進行腐蝕
for (j = 0; j < height; j++)
{
for (i = 1; i < wide - 1; i ++)
{
// 由于使用1×3的結(jié)構(gòu)元素,為防止越界,所以不處理最左邊和最右邊的兩列像素
lpSrc = (unsigned char *)(p_data + wide *j + i);
// 指向目標圖像倒數(shù)第j行,第i個象素的指針
lpDst = (unsigned char *)(temp + wide * j + i);
// 目標圖像中的當(dāng)前點先賦成黑色
*lpDst = 0;
// 如果源圖像中(-1,0)、(0,0)、(1,0)三個點之一有白點,
// 則將目標圖像中的(0,0)點賦成白色
for (n = 0; n < 3; n++)
{
if (*(lpSrc + (n - 1) ) > 128)
{
*lpDst = 255;
break;
}
}
}
}
// 復(fù)制腐蝕后的圖像
memcpy(p_data, temp, wide * height);
// 釋放內(nèi)存
delete temp;
}
else //24位真彩色
{
LONG DibWidth; //原圖長、寬
DibWidth=this->GetDibWidthBytes(); //取得原圖的每行字節(jié)數(shù)
BYTE *p_temp=new BYTE[height*DibWidth];
// 使用水平方向的結(jié)構(gòu)元素進行腐蝕
for (j = 0; j < height; j++)
{
for (i = 3; i < DibWidth - 3; i +=3)
{
// 由于使用1×3的結(jié)構(gòu)元素,為防止越界,所以不處理最左邊和最右邊的兩列像素
lpSrc = (unsigned char *)(p_data + DibWidth *j + i);
// 指向目標圖像倒數(shù)第j行,第i個象素的指針
lpDst = (unsigned char *)(p_temp + DibWidth * j + i);
// 目標圖像中的當(dāng)前點先賦成黑色
*lpDst = 0;
*(lpDst+1)=0;
*(lpDst+2)=0;
// 如果源圖像中(-1,0)、(0,0)、(1,0)三個點之一有白點,
// 則將目標圖像中的(0,0)點賦成白色
for(int m=0;m<3;m++)
{
for (n = 0; n < 3; n++)
{
if (*(lpSrc + (n - 1)*3 ) > 128)
{
*lpDst = 255;
break;
}
else
*lpDst =*lpSrc;
}
lpSrc++;
lpDst++;
}
}
}
// 復(fù)制腐蝕后的圖像
memcpy(p_data, p_temp, DibWidth * height);
// 釋放內(nèi)存
delete []p_temp;
}
}
///***************************************************************/
/*函數(shù)名稱:Quanfangxiangfushi()
/*函數(shù)類型:void
/*功能:對圖像進行全方向腐蝕。
/***************************************************************/
void FuShiYuPengZhangDib::Quanfangxiangfushi()
{
// 指向DIB象素指針
LPBYTE p_data;
// 指向源圖像的指針
LPBYTE lpSrc;
// 指向緩存圖像的指針
LPBYTE lpDst;
// 指向緩存DIB圖像的指針
LPBYTE temp;
//循環(huán)變量
int i;
int j;
int m;
int n;
// 找到DIB圖像象素起始位置
p_data = GetData();
// DIB的寬度
LONG wide= GetWidth();
// DIB的高度
LONG height =GetHeight();
if (m_pBitmapInfoHeader->biBitCount<9)//灰度圖像
{
// 暫時分配內(nèi)存,以保存新圖像
temp =new BYTE[wide*height];
// 初始化新分配的內(nèi)存,設(shè)定初始值為255
lpDst = (LPBYTE)temp;
memset(lpDst, (BYTE)255, wide * height);
// 3×3的結(jié)構(gòu)元素
int B[9] = {1, 0, 1,
0, 0, 0,
1, 0, 1};
// 使用全方向的結(jié)構(gòu)元素進行腐蝕
for (j = 1; j < height - 1; j++)
{
for (i = 1; i < wide - 1; i++)
{
// 由于使用3×3的結(jié)構(gòu)元素,為防止越界,所以不處理最左、右、上、下四邊的像素
// 指向源圖像倒數(shù)第j行,第i個象素的指針
lpSrc = (unsigned char *)(p_data + wide * j + i);
// 指向目標圖像倒數(shù)第j行,第i個象素的指針
lpDst = (unsigned char *)(temp + wide * j + i);
// 目標圖像中的當(dāng)前點先賦成黑色
*lpDst = 0;
// 如果源圖像中3×3結(jié)構(gòu)元素對應(yīng)位置有白點
// 則將目標圖像中的(0,0)點賦成白色
for (m = 0; m < 3; m++)
{
for (n = 0; n < 3; n++)
{
if (B[m + n] == 1)
continue;
if (*(lpSrc + (1 - m) * wide +(n - 1) ) > 128)
{
*lpDst = 255;
break;
}
}
}
}
}
// 復(fù)制腐蝕后的圖像
memcpy(p_data, temp, wide * height);
// 釋放內(nèi)存
delete temp;
}
else //24位真彩色
{
LONG DibWidth; //原圖長、寬
DibWidth=this->GetDibWidthBytes(); //取得原圖的每行字節(jié)數(shù)
BYTE *p_temp=new BYTE[height*DibWidth];
// 3×3的結(jié)構(gòu)元素
int B[9] = {1, 0, 1,
0, 0, 0,
1, 0, 1};
// 使用全方向的結(jié)構(gòu)元素進行腐蝕
for (j = 1; j < height - 1; j++)
{
for (i = 3; i < DibWidth - 3; i+=3)
{
// 由于使用3×3的結(jié)構(gòu)元素,為防止越界,所以不處理最左、右、上、下四邊的像素
// 指向源圖像倒數(shù)第j行,第i個象素的指針
lpSrc = (unsigned char *)(p_data + DibWidth * j + i);
// 指向目標圖像倒數(shù)第j行,第i個象素的指針
lpDst = (unsigned char *)(p_temp + DibWidth * j + i);
// 目標圖像中的當(dāng)前點先賦成黑色
*lpDst = 0;
*(lpDst+1)=0;
*(lpDst+2)=0;
// 如果源圖像中3×3結(jié)構(gòu)元素對應(yīng)位置有白點
// 則將目標圖像中的(0,0)點賦成白色
for(int l=0;l<3;l++)
{
for (m = 0; m < 3; m++)
{
for (n = 0; n < 3; n++)
{
if (B[m + n] == 1)
continue;
if (*(lpSrc + (1 - m) * DibWidth +(n - 1)*3 ) > 128)
{
*lpDst = 255;
break;
}
else
*lpDst = *lpSrc;
}
}
*lpSrc++;
*lpDst++;
}
}
}
// 復(fù)制腐蝕后的圖像
memcpy(p_data, p_temp, DibWidth * height);
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -