?? mydib.cpp
字號:
#include "stdafx.h"
#include "mydib.h"
/*************************************************************************
方塊編碼子程序
*************************************************************************/
void rectcoding(HDIB hDIB,int wRect,int hRect)
{
// 指向源圖像象素的指針
unsigned char * lpSrc;
// 指向DIB的指針
LPSTR lpDIB;
// 指向DIB象素指針
LPSTR lpDIBBits;
//鎖定并獲得位圖句柄的地址
lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) hDIB);
// 判斷是否是8-bpp位圖(這里為了方便,只處理8-bpp位圖的模糊操作,其它的可以類推)
if (::DIBNumColors(lpDIB) != 256)
{
// 提示用戶
::AfxMessageBox ("目前只支持256色位圖的運算!");
// 返回
return;
}
// 找到DIB圖像象素起始位置
lpDIBBits = ::FindDIBBits(lpDIB);
//圖像處理操作
//方塊編碼
//獲得圖像的寬度和高度
LONG lWidth=::DIBWidth ((char*)lpDIB);
LONG lHeight=::DIBHeight ((char*)lpDIB);
// 計算圖像每行的字節數
LONG lLineBytes = WIDTHBYTES(lWidth * 8);
if(lWidth!=lHeight)
{
// 提示用戶
::AfxMessageBox("只能對寬度和高度相等的圖像進行方塊編碼!");
// 返回
return;
}
//編碼過程
//循環變量
LONG i,j,k;
int ii,jj;
double* Xt=new double [lWidth*lHeight/(hRect*wRect)];
int Xi;
int* a0=new int [lWidth*lHeight/(hRect*wRect)];
int* a1=new int [lWidth*lHeight/(hRect*wRect)];
int* N0=new int [lWidth*lHeight/(hRect*wRect)];
int* N1=new int [lWidth*lHeight/(hRect*wRect)];
//計算閾值
k=0;
for (i = 0; i < lHeight; i =i+hRect)
{
for (j = 0; j < lWidth; j =j+wRect)
{
Xt[k]=0;
//計算Xt
for(ii=0;ii<hRect;ii++)
for(jj=0;jj<wRect;jj++)
{ // 指向圖像指針
lpSrc = (unsigned char *)lpDIBBits + lLineBytes * (i+ii) + (j+jj);
Xi=*lpSrc;
Xt[k]+=Xi;
}
Xt[k]/=hRect*wRect;
k++;
}
}
//計算N0、N1
k=0;
for (i = 0; i < lHeight; i =i+hRect)
{
for (j = 0; j < lWidth; j =j+wRect)
{
N0[k]=0;
N1[k]=0;
//計算N0、N1
for(ii=0;ii<hRect;ii++)
for(jj=0;jj<wRect;jj++)
{ // 指向圖像指針
lpSrc = (unsigned char *)lpDIBBits + lLineBytes * (i+ii) + (j+jj);
Xi=*lpSrc;
if(Xi<Xt[k]) N0[k]++;
else N1[k]++;
}
k++;
}
}
//計算a0、a1
k=0;
for (i = 0; i < lHeight; i =i+hRect)
{
for (j = 0; j < lWidth; j =j+wRect)
{
a0[k]=0;
a1[k]=0;
//計算N0、N1
for(ii=0;ii<hRect;ii++)
for(jj=0;jj<wRect;jj++)
{ // 指向圖像指針
lpSrc = (unsigned char *)lpDIBBits + lLineBytes * (i+ii) + (j+jj);
Xi=*lpSrc;
if(Xi<Xt[k]) a0[k]+=Xi;
else a1[k]+=Xi;
}
if(N0[k]!=0&&N1[k]!=0)
{ a0[k]/=N0[k];
a1[k]/=N1[k];
}
k++;
}
}
//二值化編碼過程
k=0;
for (i = 0; i < lHeight; i =i+hRect)
{
for (j = 0; j < lWidth; j =j+wRect)
{
for(ii=0;ii<hRect;ii++)
for(jj=0;jj<wRect;jj++)
{ // 指向圖像指針
lpSrc = (unsigned char *)lpDIBBits + lLineBytes * (i+ii) + (j+jj);
Xi=*lpSrc;
if(Xi<Xt[k]) Xi=a0[k];
else Xi=a1[k];
//賦新的像素值給像素
*lpSrc=Xi;
}
k++;
}
}
::GlobalUnlock((HGLOBAL) hDIB);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -