?? pointpro.cpp
字號:
// 更新DIB調色板藍色分量
pPalette[i].rgbBlue = bpColorsTable[i * 4 + 2];
// 更新DIB調色板保留位
pPalette[i].rgbReserved = 0;
}
::GlobalUnlock( m_pDibObject->GetDib() );
return(TRUE);
}
////////////////////////////////////////////////////////////////////////
//unsigned char *PointSlopeLinerTran(float fa, float fb)
//----------------------------------------------------------------------
//基本功能:本函數計算點斜線性變換的灰度映射表,它是一個輔助函數,供點斜
// 線性變換函數使用。
//----------------------------------------------------------------------
//參數說明:float fa 線性變換的斜率
// float fb 線性變換的截距
//----------------------------------------------------------------------
//返回:unsigned char *型的灰度映射表。
//----------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////
unsigned char *CPointPro::PointSlopeLinerTran(float fa,
float fb)
{
// 灰度映射表
unsigned char *pMap = new unsigned char[256];
// 計算灰度映射表
for (int i = 0; i <= 255; i++)
{
float fTemp = fa * (float)(i) + fb;
// 判斷是否超出范圍
if (fTemp > 255)
{
// 直接賦值為255
pMap[i] = 255;
}
else if (fTemp < 0)
{
// 直接賦值為0
pMap[i] = 0;
}
else
{
// 四舍五入
pMap[i] = (unsigned char) (fTemp + 0.5);
}
}
return(pMap);
}
////////////////////////////////////////////////////////////////////////
//unsigned char *DoublePointLinerTran()
//----------------------------------------------------------------------
//基本功能:本函數計算點斜線性變換的灰度映射表,它是一個輔助函數,供點斜
// 線性變換函數使用。
//----------------------------------------------------------------------
//參數說明:BYTE bX1 灰度拉伸第一個點的x坐標
// BYTE bY1 灰度拉伸第一個點的y坐標
// BYTE bX2 灰度拉伸第二個點的x坐標
// BYTE bY2 灰度拉伸第二個點的y坐標
//----------------------------------------------------------------------
//返回:unsigned char *型的灰度映射表。
//----------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////
unsigned char * CPointPro::DoublePointLinerTran(BYTE bX1,
BYTE bY1,
BYTE bX2,
BYTE bY2)
{
// 灰度映射表
unsigned char *pMap = new unsigned char[256];
// 計算灰度映射表
for (int i = 0; i <= bX1; i++)
{
// 判斷bX1是否大于0(防止分母為0)
if (bX1 > 0)
{
// 線性變換
pMap[i] = (BYTE) bY1 * i / bX1;
}
else
{
// 直接賦值為0
pMap[i] = 0;
}
}
for (; i <= bX2; i++)
{
// 判斷bX1是否等于bX2(防止分母為0)
if (bX2 != bX1)
{
// 線性變換
pMap[i] = bY1 + (BYTE) ((bY2 - bY1) * (i - bX1) / (bX2 - bX1));
}
else
{
// 直接賦值為bY1
pMap[i] = bY1;
}
}
for (; i < 256; i++)
{
// 判斷bX2是否等于255(防止分母為0)
if (bX2 != 255)
{
// 線性變換
pMap[i] = bY2 + (BYTE) ((255 - bY2) * (i - bX2) / (255 - bX2));
}
else
{
// 直接賦值為255
pMap[i] = 255;
}
}
return(pMap);
}
////////////////////////////////////////////////////////////////////////
//BOOL IsBlackandWhite256(CDibObject *pDibObject)
//----------------------------------------------------------------------
//基本功能:本函數判斷傳入的CDibObject對象中的圖像是否為256級二值圖像。
//----------------------------------------------------------------------
//參數說明:CDibObject *pDibObject, 默認為NULL
//----------------------------------------------------------------------
//返回:BOOL:成功返回TRUE,失敗返回FALSE。
//----------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////
BOOL CPointPro::IsBlackandWhite256(CDibObject *pDibObject)
{
//使用傳入的CDibObject對象
if( pDibObject != NULL ) m_pDibObject = pDibObject;
//無CDibObject對象, 返回FALSE
if( m_pDibObject == NULL ) return( FALSE );
//不是8位圖像,必不是256級灰度圖像,不處理返回FALSE
if( !IsGray256() ) return( FALSE );
unsigned char *pBuffer, *pBits, *pTemp;
BITMAPINFOHEADER *pBIH;
RGBQUAD *pPalette;
int nWidthBytes, nNumColors;
pBuffer = (unsigned char *) m_pDibObject->GetDIBPointer( &nWidthBytes,
m_pDibObject->GetNumBits() );
if( pBuffer == NULL ) return( -1 );
//pBIH:獲得位圖信息頭地址
pBIH = (BITMAPINFOHEADER *) &pBuffer[sizeof(BITMAPFILEHEADER)];
//nNumColors:獲得調色板中的顏色數。圖像為16位色或更高時為0
nNumColors = m_pDibObject->GetNumColors();
//pPalette:獲得調色板數據地址
pPalette = (RGBQUAD *) &pBuffer[sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)];
//pBits:獲得位圖數據地址
pBits = (unsigned char *) &pBuffer[sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+
nNumColors*sizeof(RGBQUAD)];
//獲取灰度圖像的寬度和高度(以像素表示)
int nWidth = pBIH->biWidth;
int nHeight = pBIH->biHeight;
for(int y = 0; y < nHeight; y++)
{
pTemp = pBits;
pTemp += y * nWidthBytes; //位圖數據下一行起始指針
for(int x = 0; x < nWidth; x++)
{
if( pTemp[x] != 0 && pTemp[x] != 255) return(FALSE);
}
}
return(TRUE);
}
////////////////////////////////////////////////////////////////////////
//int *GetHistogram()
//----------------------------------------------------------------------
//基本功能:本函數獲得傳入的CDibObject對象中圖像的直方圖。如果進行此調
// 整之前沒有指定一個CDibObject對象指針,則必須在調整時加以指
// 定。任何未傳入的坐標值或默認的-1坐標值都將被置為圖像的最大值
// 或最大植。變量nX1和nY1將被置為0,nX2將被置為圖像寬度減1,nY2
// 將被置為圖像高度減1。想要在整個圖像上進行操作時,最好的方法
// 是不傳入nX1、nY1、nX2和nY2值。這樣它們會被默認為整個圖像。
//----------------------------------------------------------------------
//參數說明:int nX1, 默認為-1
// int nY1, 默認為-1
// int nX2, 默認為-1
// int nY2, 默認為-1
// CDibObject *pDibObject, 默認為NULL。
//----------------------------------------------------------------------
//返 回:直方圖數組指針*pBuffer其中:
// nHistogramBuffer[] 存儲亮度直方圖數據
// nHistogramBuffer[256] 存儲紅色直方圖數據
// nHistogramBuffer[512] 存儲綠色直方圖數據
// nHistogramBuffer[768] 存儲藍直方圖數據
//----------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////
int *CPointPro::GetHistogram( int nX1,
int nY1,
int nX2,
int nY2,
CDibObject *pDibObject)
{
//使用傳入的CDibObject對象
if( pDibObject != NULL ) m_pDibObject = pDibObject;
//無CDibObject對象, 返回FALSE
if( m_pDibObject == NULL ) return( FALSE );
//坐標規整化
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 );
//獲得顏色數
nNumColors = m_pDibObject->GetNumColors();
//獲得調色板指針
pPalette = (RGBQUAD *) &pBuffer[sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)];
//獲得位圖數據指針
pBits = (unsigned char *) &pBuffer[sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+nNumColors*sizeof(RGBQUAD)];
//創建直方圖數據
int *nHistogramBuffer = CreateHistogram( nX1, nY1, nX2, nY2, pBits, pPalette, nWidthBytes );
::GlobalUnlock( m_pDibObject->GetDib() );
return( nHistogramBuffer );
}
////////////////////////////////////////////////////////////////////////
//BOOL SplitChannels()
//----------------------------------------------------------------------
//基本功能:本函數將傳入的CDibObject對象中的圖像分離成由紅、綠、藍分量
// 構成的256色灰度圖像。
//----------------------------------------------------------------------
//參數說明:CDibObject *pRed 指向紅色通道的圖像指針
// CDibObject *pGreen 指向綠色通道的圖像指針
// CDibObject *pBlue 指向藍色通道的圖像指針
//----------------------------------------------------------------------
//返 回:成功返回TRUE,失敗返回FALSE。
//----------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////
BOOL CPointPro::SplitChannels(CDibObject *pRed,
CDibObject *pGreen,
CDibObject *pBlue)
{
//沒有傳入相應指針無法完成操作
if(m_pDibObject == NULL)
{
AfxMessageBox("沒有傳入原始圖像,無法完成操作!");
return FALSE;
}
if(pRed == NULL)
{
AfxMessageBox("沒有傳入紅色通道指針,無法完成操作!");
return FALSE;
}
if(pGreen == NULL)
{
AfxMessageBox("沒有傳入綠色通道指針,無法完成操作!");
return FALSE;
}
if(pBlue == NULL)
{
AfxMessageBox("沒有傳入藍色通道指針,無法完成操作!");
return FALSE;
}
//已是256色灰度圖像不用再轉換
if(IsGray256())
{
AfxMessageBox("已是256色灰度圖像,不能進行通道分離!");
return FALSE;
}
//紅色通道
MakeGray256(1, pRed);
//綠色通道
MakeGray256(2, pGreen);
//藍色通道
MakeGray256(3, pBlue);
return TRUE;
}
////////////////////////////////////////////////////////////////////////
//BOOL GetMixedChannel()
//----------------------------------------------------------------------
//基本功能:本函數獲得傳入的CDibObject對象中的圖像中的混合分量通道。
//----------------------------------------------------------------------
//參數說明:CDibObject *pMixed 指向混合通道的圖像指針
//----------------------------------------------------------------------
//返 回:成功返回TRUE,失敗返回FALSE。
//----------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////
BOOL CPointPro::GetMixedChannel(CDibObject *pMixed)
{
//沒有傳入相應指針無法完成操作
if(m_pDibObject == NULL)
{
AfxMessageBox("沒有傳入原始圖像,無法完成操作!");
return FALSE;
}
if(pMixed == NULL)
{
AfxMessageBox("沒有傳入通道指針,無法完成操作!");
return FALSE;
}
//已是256色灰度圖像不用再轉換
if(IsGray256())
{
AfxMessageBox("已是256色灰度圖像,不能進行通道分離!");
return FALSE;
}
MakeGray256(0, pMixed);
return TRUE;
}
////////////////////////////////////////////////////////////////////////
//BOOL GetRedChannel()
//----------------------------------------------------------------------
//基本功能:本函數獲得傳入的CDibObject對象中的圖像中的紅色分量通道。
//----------------------------------------------------------------------
//參數說明:CDibObject *pRed 指向紅色通道的圖像指針
//----------------------------------------------------------------------
//返 回:成功返回TRUE,失敗返回FALSE。
//----------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////
BOOL CPointPro::GetRedChannel(CDibObject *pRed)
{
//沒有傳入相應指針無法完成操作
if(m_pDibObject == NULL)
{
AfxMessageBox("沒有傳入原始圖像,無法完成操作!");
return FALSE;
}
if(pRed == NULL)
{
AfxMessageBox("沒有傳入紅色通道指針,無法完成操作!");
return FALSE;
}
//已是256色灰度圖像不用再轉換
if(IsGray256())
{
AfxMessageBox("已是256色灰度圖像,不能進行通道分離!");
return FALSE;
}
//紅色通道
MakeGray256(1, pRed);
return TRUE;
}
////////////////////////////////////////////////////////////////////////
//BOOL GetGreenChannel()
//----------------------------------------------------------------------
//基本功能:本函數獲得傳入的CDibObject對象中的圖像中的綠色分量通道。
//----------------------------------------------------------------------
//參數說明:CDibObject *pGreen 指向混合通道的圖像指針
//----------------------------------------------------------------------
//返 回:成功返回TRUE,失敗返回FALSE。
//----------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////
BOOL CPointPro::GetGreenChannel(CDibObject *pGreen)
{
//沒有傳入相應指針無法完成操作
if(m_pDibObject == NULL)
{
AfxMessageBox("沒有傳入原始圖像,無法完成操作!");
return FALSE;
}
if(pGreen == NULL)
{
AfxMessageBox("沒有傳入通道指針,無法完成操作!");
return FALSE;
}
//已是256色灰度圖像不用再轉換
if(IsGray256())
{
AfxMessageBox("已是
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -