?? areapro.cpp
字號(hào):
// AreaPro.cpp: implementation of the CAreaPro class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "AreaPro.h"
IMPLEMENT_DYNCREATE(CAreaPro, CObject)
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//Diagnostics and dump member functions, overridden
#ifdef _DEBUG
void CAreaPro::Dump(CDumpContext &dc) const
{
//call base class function first
CObject::Dump(dc);
}
#endif
#ifdef _DEBUG
void CAreaPro::AssertValid() const
{
//call inherited AssertValid first
CObject::AssertValid();
//Check CDibObject members...
ASSERT(m_pDibObject != NULL); //Must exist
}
#endif
/***********************************************************************
* *
* 區(qū)處理類(lèi) *
* *
***********************************************************************/
////////////////////////////////////////////////////////////////////////
//構(gòu)造函數(shù)CAreaPro()
//----------------------------------------------------------------------
//基本功能:構(gòu)造一個(gè)CAreaPro類(lèi)的對(duì)象,如不傳入CDibObject對(duì)象。第一次調(diào)
// 用某一個(gè)處理函數(shù)時(shí)必須給出一個(gè)CDibObject對(duì)象指針。
//----------------------------------------------------------------------
//參數(shù)說(shuō)明:無(wú)
//----------------------------------------------------------------------
//返 回:無(wú)
//----------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////
CAreaPro::CAreaPro()
{
}
////////////////////////////////////////////////////////////////////////
//構(gòu)造函數(shù)CAreaPro()
//----------------------------------------------------------------------
//基本功能:構(gòu)造一個(gè)CAreaPro類(lèi)的對(duì)象并傳入CDibObject對(duì)象。所有的操作都
// 針對(duì)該對(duì)象,直到另一個(gè)對(duì)象作為參數(shù)被傳給圖像處理函數(shù)。
//----------------------------------------------------------------------
//參數(shù)說(shuō)明:CDibObject *pDibObject
//----------------------------------------------------------------------
//返 回:無(wú)
//----------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////
CAreaPro::CAreaPro(CDibObject *pDibObject)
{
m_pDibObject = pDibObject;
}
//析構(gòu)函數(shù)
CAreaPro::~CAreaPro()
{
}
////////////////////////////////////////////////////////////////////////
//void SetDibObjectClass(CDibObject *pDibObject)
//----------------------------------------------------------------------
//基本功能:本函數(shù)為CAreaPro類(lèi)對(duì)象指定一個(gè)CDibObject對(duì)象指針
//----------------------------------------------------------------------
//參數(shù)說(shuō)明:CDibObject *pDibObject, 默認(rèn)為NULL。
//----------------------------------------------------------------------
//返 回:無(wú)。
//----------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////
void CAreaPro::SetDibObjectClass( CDibObject *pDibObject )
{
m_pDibObject = pDibObject;
}
////////////////////////////////////////////////////////////////////////
//int *GetHistogram()
//----------------------------------------------------------------------
//基本功能:本函數(shù)獲得傳入的m_pDibObject對(duì)象中圖像直方圖。如果進(jìn)行此調(diào)
// 整之前沒(méi)有指定一個(gè)CDibObject對(duì)象指針,則必須在調(diào)整時(shí)加以指
// 定。任何未傳入的坐標(biāo)值或默認(rèn)的-1坐標(biāo)值都將被置為圖像的最大值
// 或最大植。變量nX1和nY1將被置為0,nX2將被置為圖像寬度減1,nY2
// 將被置為圖像高度減1。想要在整個(gè)圖像上進(jìn)行操作時(shí),最好的方法
// 是不傳入nX1、nY1、nX2和nY2值。這樣它們會(huì)被默認(rèn)為整個(gè)圖像。
//----------------------------------------------------------------------
//參數(shù)說(shuō)明:int nX1, 默認(rèn)為-1
// int nY1, 默認(rèn)為-1
// int nX2, 默認(rèn)為-1
// int nY2, 默認(rèn)為-1
//----------------------------------------------------------------------
//返 回:直方圖數(shù)組指針*pBuffer其中:
// nHistogramBuffer[] 存儲(chǔ)亮度直方圖數(shù)據(jù)
// nHistogramBuffer[256] 存儲(chǔ)紅色直方圖數(shù)據(jù)
// nHistogramBuffer[512] 存儲(chǔ)綠色直方圖數(shù)據(jù)
// nHistogramBuffer[768] 存儲(chǔ)藍(lán)直方圖數(shù)據(jù)
//----------------------------------------------------------------------
//注 意:此函數(shù)聲明為保護(hù)型,只能在CAreaPro類(lèi)中使用
//----------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////
int *CAreaPro::GetHistogram( int nX1, int nY1, int nX2, int nY2)
{
//無(wú)CDibObject對(duì)象, 返回FALSE
if( m_pDibObject == NULL ) return( FALSE );
//坐標(biāo)規(guī)整化
m_pDibObject->NormalizeCoordinates( &nX1, &nY1, &nX2, &nY2 );
//定義變量
unsigned char *pBuffer, *pBits;
RGBQUAD *pPalette;
int nWidthBytes, nNumColors;
//獲得圖像指針
pBuffer = (unsigned char *) m_pDibObject->GetDIBPointer( &nWidthBytes,
m_pDibObject->GetNumBits() );
if( pBuffer == NULL ) return( NULL );
//獲得顏色數(shù)
nNumColors = m_pDibObject->GetNumColors();
//獲得調(diào)色板指針
pPalette = (RGBQUAD *) &pBuffer[sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)];
//獲得位圖數(shù)據(jù)指針
pBits = (unsigned char *) &pBuffer[sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)
+ nNumColors * sizeof(RGBQUAD)];
//創(chuàng)建直方圖數(shù)據(jù)
int *nHistogramBuffer = CreateHistogram(nX1, nY1, nX2, nY2, pBits,
pPalette, nWidthBytes);
::GlobalUnlock(m_pDibObject->GetDib());
return(nHistogramBuffer);
}
////////////////////////////////////////////////////////////////////////
//int *CreateHistogram()
//----------------------------------------------------------------------
//基本功能:本函數(shù)創(chuàng)建傳入m_pDibObject對(duì)象中圖像的直方圖。如果進(jìn)行此調(diào)
// 整之前沒(méi)有指定一個(gè)CDibObject對(duì)象指針,則必須在調(diào)整時(shí)加以指
// 定。任何未傳入的坐標(biāo)值或默認(rèn)的-1坐標(biāo)值都將被置為圖像的最大值
// 或最大植。變量nX1和nY1將被置為0,nX2將被置為圖像寬度減1,nY2
// 將被置為圖像高度減1。想要在整個(gè)圖像上進(jìn)行操作時(shí),最好的方法
// 是不傳入nX1、nY1、nX2和nY2值。這樣它們會(huì)被默認(rèn)為整個(gè)圖像。
//----------------------------------------------------------------------
//參數(shù)說(shuō)明:int nX1 默認(rèn)為-1
// int nY1 默認(rèn)為-1
// int nX2 默認(rèn)為-1
// int nY2 默認(rèn)為-1
// unsigned char *pData 圖像位圖數(shù)據(jù)指針
// RGBQUAD *pPalette 圖像調(diào)色板指針
// int nWidthBytes 圖像字節(jié)寬度
//----------------------------------------------------------------------
//返 回:直方圖數(shù)組指針*pBuffer其中:
// pBuffer[] 存儲(chǔ)亮度直方圖數(shù)據(jù)
// pBuffer[256] 存儲(chǔ)紅色直方圖數(shù)據(jù)
// pBuffer[512] 存儲(chǔ)綠色直方圖數(shù)據(jù)
// pBuffer[768] 存儲(chǔ)藍(lán)直方圖數(shù)據(jù)
//----------------------------------------------------------------------
//注 意:此函數(shù)聲明為保護(hù)型,只能在CAreaPro類(lèi)中使用
//----------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////
int *CAreaPro::CreateHistogram(int nX1, int nY1, int nX2, int nY2,
unsigned char *pData,
RGBQUAD *pPalette,
int nWidthBytes)
{
//圖像指針為空,無(wú)法操作返回
if(m_pDibObject == NULL) return(FALSE);
//分配直方圖數(shù)據(jù)緩存區(qū)(數(shù)組)
int *pBuffer = new int [256 * 4];
//分配直方圖數(shù)據(jù)緩存區(qū)失敗
if(pBuffer == NULL) return( NULL );
//直方圖數(shù)據(jù)緩存區(qū)清零
memset(pBuffer, 0, (256 * 4) * sizeof(int));
//變量定義
DWORD dwGray;
int x, y;
unsigned char *pTemp, ucRed, ucGreen, ucBlue;
//圖像的高度
int nHeight = m_pDibObject->GetHeight();
switch(m_pDibObject->GetNumBits())
{
case 1: //每像素位數(shù)為1,不處理
break;
case 4: //每像素位數(shù)為4,不處理
break;
case 8: //每像素位數(shù)為8
for( y = nY1; y <= nY2; y++ )
{
//數(shù)據(jù)指針定位到圖像數(shù)據(jù)起始位置
pTemp = pData;
//數(shù)據(jù)指針定位到圖像數(shù)據(jù)每行的起始零位置
pTemp += ((nHeight - 1 - y) * nWidthBytes);
//數(shù)據(jù)指針定位到圖像數(shù)據(jù)每行的起始nX1位置
pTemp += nX1;
for(x = nX1; x <= nX2; x++)
{
//pTemp[x]為當(dāng)前像素值,以此為調(diào)色板項(xiàng)的索引值,
//取出調(diào)色板項(xiàng)的相應(yīng)紅綠藍(lán)分量值。
ucRed = pPalette[pTemp[x]].rgbRed;
ucGreen = pPalette[pTemp[x]].rgbGreen;
ucBlue = pPalette[pTemp[x]].rgbBlue;
//按關(guān)系L=0.3R+0.59G+0.11B,得到亮度值
dwGray = ((DWORD) ucRed * 30 +
(DWORD) ucGreen * 59 +
(DWORD) ucBlue * 11) / 100;
dwGray &= 0x000000ff;
//亮度直方圖數(shù)據(jù)
pBuffer[dwGray]++;
//紅色直方圖數(shù)據(jù)
pBuffer[256 + ucRed]++;
//綠色直方圖數(shù)據(jù)
pBuffer[512 + ucGreen]++;
//藍(lán)色直方圖數(shù)據(jù)
pBuffer[768 + ucBlue]++;
}
}
break;
case 16: //每像素位數(shù)為16
for(y = nY1; y <= nY2; y++)
{
//數(shù)據(jù)指針定位到圖像數(shù)據(jù)起始位置
pTemp = pData;
//數(shù)據(jù)指針定位到圖像數(shù)據(jù)每行的起始零位置
pTemp += (( nHeight - 1 - y) * nWidthBytes);
//數(shù)據(jù)指針定位到圖像數(shù)據(jù)每行的起始nX1位置
pTemp += (nX1 * 2);
for(x = nX1; x <= nX2; x++)
{
//調(diào)用GETRGB555宏獲取三原色分量
GETRGB555(ucRed, ucGreen, ucBlue, pTemp);
//按關(guān)系L=0.3R+0.59G+0.11B,得到亮度值
dwGray = ((DWORD) ucRed * 30 +
(DWORD) ucGreen * 59 +
(DWORD) ucBlue * 11) / 100;
dwGray &= 0x000000ff;
//亮度直方圖數(shù)據(jù)
pBuffer[dwGray]++;
//紅色直方圖數(shù)據(jù)
pBuffer[256 + ucRed]++;
//綠色直方圖數(shù)據(jù)
pBuffer[512 + ucGreen]++;
//藍(lán)色直方圖數(shù)據(jù)
pBuffer[768 + ucBlue]++;
//數(shù)據(jù)指針加2
pTemp += 2;
}
}
break;
case 24: //每像素位數(shù)為24
for(y = nY1; y < nY2; y++)
{
//數(shù)據(jù)指針定位到圖像數(shù)據(jù)起始位置
pTemp = pData;
//數(shù)據(jù)指針定位到圖像數(shù)據(jù)每行的起始零位置
pTemp += (( nHeight - 1 - y) * nWidthBytes);
//數(shù)據(jù)指針定位到圖像數(shù)據(jù)每行的起始nX1位置
pTemp += (nX1 * 3);
for(x=nX1; x<=nX2; x++)
{
//獲取像素顏色的三原色。
ucRed = pTemp[x * 3 + 2];
ucGreen = pTemp[x * 3 + 1];
ucBlue = pTemp[x * 3];
//按關(guān)系L=0.3R+0.59G+0.11B,得到亮度值
dwGray = ((DWORD) ucRed * 30 +
(DWORD) ucGreen * 59 +
(DWORD) ucBlue * 11) / 100;
dwGray &= 0x000000ff;
//亮度直方圖數(shù)據(jù)
pBuffer[dwGray]++;
//紅色直方圖數(shù)據(jù)
pBuffer[256 + ucRed]++;
//綠色直方圖數(shù)據(jù)
pBuffer[512 + ucGreen]++;
//藍(lán)色直方圖數(shù)據(jù)
pBuffer[768 + ucBlue]++;
//數(shù)據(jù)指針加3
pTemp += 3;
}
}
break;
case 32: //每像素位數(shù)為24
for(y = nY1; y <= nY2; y++)
{
//數(shù)據(jù)指針定位到圖像數(shù)據(jù)起始位置
pTemp = pData;
//數(shù)據(jù)指針定位到圖像數(shù)據(jù)每行的起始零位置
pTemp += (( nHeight - 1 - y) * nWidthBytes);
//數(shù)據(jù)指針定位到圖像數(shù)據(jù)每行的起始nX1位置
pTemp += (nX1 * 4);
for(x = nX1; x <= nX2; x++)
{
//調(diào)用GETRGB888宏獲取像素顏色的三原色。
GETRGB888(ucRed, ucGreen, ucBlue, pTemp);
//按關(guān)系L=0.3R+0.59G+0.11B,得到亮度值
dwGray = ((DWORD) ucRed * 30 +
(DWORD) ucGreen * 59 +
(DWORD) ucBlue * 11) / 100;
dwGray &= 0x000000ff;
//亮度直方圖數(shù)據(jù)
pBuffer[dwGray]++;
//紅色直方圖數(shù)據(jù)
pBuffer[256 + ucRed]++;
//綠色直方圖數(shù)據(jù)
pBuffer[512 + ucGreen]++;
//藍(lán)色直方圖數(shù)據(jù)
pBuffer[768 + ucBlue]++;
//數(shù)據(jù)指針加4
pTemp += 4;
}
}
break;
}
return( pBuffer );
}
////////////////////////////////////////////////////////////////////////
//BOOL Convolution()
//----------------------------------------------------------------------
//基本功能:本函數(shù)對(duì)指定的兩個(gè)數(shù)組進(jìn)行卷積運(yùn)算。
//----------------------------------------------------------------------
//參數(shù)說(shuō)明:float *fpData 被執(zhí)行卷積的數(shù)組
// float *fpKernel 卷積核數(shù)組
// float fCoef 卷積系數(shù)
// int nSize 卷積尺寸
// unsigned char *nResult 卷積結(jié)果
//----------------------------------------------------------------------
//返 回:無(wú)。
//----------------------------------------------------------------------
//注 意:此函數(shù)聲明為私有型,只能在CAreaPro類(lèi)中使用
//----------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////
void CAreaPro::Convolution(float *fpData, float *fpKernel, float fCoef,
int nSize, unsigned char *nResult)
{
int i;
float Sum = 0, fResult;
//計(jì)算卷積
for(i = 0; i < nSize; i++)
{
Sum += fpData[i] * fpKernel[i];
}
//執(zhí)行卷積后的結(jié)果
fResult = Sum / fCoef;
//求絕對(duì)值
fResult = (float)fabs(fResult);
//判斷是否超過(guò)255
if(fResult > 255.0 )
{
// 直接賦值為255
fResult = 255.0;
}
//對(duì)卷積結(jié)果四舍五入,并轉(zhuǎn)換成unsigned char類(lèi)型作為最后返回結(jié)果
*nResult = (unsigned char) (fResult + 0.5);
}
////////////////////////////////////////////////////////////////////////
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -