?? pointpro.cpp
字號:
// PointPro.cpp: implementation of the CPointPro class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "PointPro.h"
#include "math.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
IMPLEMENT_DYNCREATE(CPointPro, CObject)
//Diagnostics and dump member functions, overridden
#ifdef _DEBUG
void CPointPro::Dump(CDumpContext &dc) const
{
//call base class function first
CObject::Dump(dc);
}
#endif
#ifdef _DEBUG
void CPointPro::AssertValid() const
{
//call inherited AssertValid first
CObject::AssertValid();
//Check CDibObject members...
ASSERT(m_pDibObject != NULL); //Must exist
}
#endif
/***********************************************************************
* *
* 點處理 *
* *
***********************************************************************/
////////////////////////////////////////////////////////////////////////
//CPointPro()
//----------------------------------------------------------------------
//基本功能:構造CPointPro類對象。由于此構造函數沒有
// CDibObject類,所以必須為其他所用到的CPointPro函
// 數提供一個CDibObject構造器。
//----------------------------------------------------------------------
//參數說明:無
//----------------------------------------------------------------------
//返 回:無
//----------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////
CPointPro::CPointPro()
{
}
////////////////////////////////////////////////////////////////////////
//CPointPro(CDibObject *pDibObject)
//----------------------------------------------------------------------
//基本功能:構造CPointPro類對象。由于此構造函數有一個
// CDibObject類,所以無須為其他所用到的CPointPro函
// 數提供一個CDibObject構造器
//----------------------------------------------------------------------
//參數說明:無
//----------------------------------------------------------------------
//返 回:無
//----------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////
CPointPro::CPointPro( CDibObject *pDibObject )
{
m_pDibObject = pDibObject;
}
////////////////////////////////////////////////////////////////////////
//BOOL MakeGray256(BYTE mGrayType, CDibObject *pDibObject)
//----------------------------------------------------------------------
//基本功能:本函數將傳入的CDibObject對象中的圖像從彩色轉換為灰度圖像。
// 如果進行此調整之前沒有指定一個CDibObject對象指針,則必須在
// 調整時加以指定。
//----------------------------------------------------------------------
//參數說明:BYTE mGrayType 0:Y=0.3R+0.59G+0.11B
// 1: Y=R
// 2: Y=G
// 3: Y=B
// CDibObject *pDibObject, 默認為NULL。
//----------------------------------------------------------------------
//返 回:成功返回TRUE,失敗返回FALSE。
//----------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////
BOOL CPointPro::MakeGray256(BYTE mGrayType,
CDibObject *pDibObject )
{
//CDibObject對象指針
if( pDibObject != NULL ) m_pDibObject = pDibObject;
//若未指定 CDibObject 對象指針返回FALSE
if( m_pDibObject == NULL ) return( FALSE );
//低于8位的圖像不進行處理
if( m_pDibObject->GetNumBits() < 8 ) return( FALSE );
//獲取原圖像字節寬度和轉換后的8位256色灰度圖像的字節寬度
int nOldWidthBytes, nNewWidthBytes;
char *pBuffer = (char *) m_pDibObject->GetDIBPointer( &nOldWidthBytes, 8, &nNewWidthBytes );
if( pBuffer == NULL ) return( FALSE );
//定義變量
BITMAPINFOHEADER *pOldBIH, *pNewBIH;
BITMAPFILEHEADER *pOldBFH, *pNewBFH;
RGBQUAD *pOldRGBPalette, *pNewRGBPalette;
unsigned char *pOldBits, *pNewBits, *pTemp, *pNewTemp;
int nNumColors, nNumNewColors;
//獲取文件頭指針
pOldBFH = (BITMAPFILEHEADER *) pBuffer;
//獲取信息頭指針
pOldBIH = (BITMAPINFOHEADER *) &pBuffer[sizeof(BITMAPFILEHEADER)];
//獲取調色板指針
pOldRGBPalette = (RGBQUAD *) &pBuffer[sizeof(BITMAPFILEHEADER)+
sizeof(BITMAPINFOHEADER)];
//原圖像顏色數
nNumColors = m_pDibObject->GetNumColors();
//新圖像顏色數
nNumNewColors = 256;
//獲取原圖像數據指針
pOldBits = (unsigned char *) &pBuffer[sizeof(BITMAPFILEHEADER)
+sizeof(BITMAPINFOHEADER)+nNumColors*sizeof(RGBQUAD)];
//為新圖像分配內存
HGLOBAL hGlobal;
//新圖像總字節數
DWORD dwSize;
dwSize = sizeof( BITMAPFILEHEADER ) + sizeof( BITMAPINFOHEADER ) +
256 * sizeof( RGBQUAD ) +
m_pDibObject->GetHeight() * nNewWidthBytes;
hGlobal = ::GlobalAlloc( GMEM_MOVEABLE | GMEM_ZEROINIT, dwSize );
if( hGlobal == NULL )
{
::GlobalUnlock( m_pDibObject->GetDib() );
return( FALSE );
}
pBuffer = (char *) ::GlobalLock( hGlobal );
if( pBuffer == NULL )
{
::GlobalFree( hGlobal );
::GlobalUnlock( m_pDibObject->GetDib() );
return( FALSE );
}
//獲得新圖像的文件頭指針
pNewBFH = (BITMAPFILEHEADER *) pBuffer;
//獲得新圖像的信息頭指針
pNewBIH = (BITMAPINFOHEADER *) &pBuffer[sizeof(BITMAPFILEHEADER)];
//獲得新圖像的調色板指針
pNewRGBPalette = (RGBQUAD *) &pBuffer[sizeof(BITMAPFILEHEADER)
+sizeof(BITMAPINFOHEADER)];
//復制原圖像文件頭數據到新圖像文件頭
*pNewBFH = *pOldBFH;
//復制原圖像信息頭數據到新圖像信息頭
*pNewBIH = *pOldBIH;
//循環變量定義
int i, j = 256, x, y;
pNewBIH->biBitCount = 8;
pNewBIH->biSizeImage = nNewWidthBytes * m_pDibObject->GetHeight();
pNewBIH->biClrUsed = 256;
pNewBFH->bfSize = sizeof( BITMAPFILEHEADER ) +
sizeof( BITMAPINFOHEADER ) +
256 * sizeof( RGBQUAD ) +
pNewBIH->biSizeImage;
pNewBFH->bfOffBits = sizeof( BITMAPFILEHEADER ) +
sizeof( BITMAPINFOHEADER ) +
nNumNewColors * sizeof( RGBQUAD );
pNewBits = (unsigned char *) &pBuffer[sizeof(BITMAPFILEHEADER) +
sizeof(BITMAPINFOHEADER) + 256 * sizeof(RGBQUAD)];
m_pDibObject->SetPaletteBytes( 256 * sizeof( RGBQUAD ));
//創建256色灰度調色板
for( i = 0; i < j; i++ )
{
pNewRGBPalette[i].rgbRed = i;
pNewRGBPalette[i].rgbGreen = i;
pNewRGBPalette[i].rgbBlue = i;
}
unsigned char *pLookup; //調色板查找表
DWORD dwGray; //灰度級別
switch( m_pDibObject->GetNumBits() )
{
case 8: //256色圖像
pLookup = new unsigned char [256];
if( pLookup == NULL ) break;
memset( pLookup, 0, 256 ); //調色板查找表清0(256項)
switch( mGrayType)
{
case 0: //按亮度Y=0.3R+0.59G+0.11B將彩色圖像轉換為灰度圖像
for( i=0; i<256; i++ )
{
dwGray = ( (DWORD) pOldRGBPalette[i].rgbRed * 30 +
(DWORD) pOldRGBPalette[i].rgbGreen * 59 +
(DWORD) pOldRGBPalette[i].rgbBlue * 11 ) / 100;
pLookup[i] = (unsigned char) dwGray;
}
break;
case 1: //按亮度Y=R將彩色圖像轉換為灰度圖像
for( i=0; i<256; i++ )
{
dwGray = (DWORD) pOldRGBPalette[i].rgbRed;
pLookup[i] = (unsigned char) dwGray;
}
break;
case 2: //按亮度Y=G將彩色圖像轉換為灰度圖像
for( i=0; i<256; i++ )
{
dwGray = (DWORD) pOldRGBPalette[i].rgbGreen;
pLookup[i] = (unsigned char) dwGray;
}
break;
case 3: //按亮度Y=B將彩色圖像轉換為灰度圖像
for( i=0; i<256; i++ )
{
dwGray =(DWORD) pOldRGBPalette[i].rgbBlue;
pLookup[i] = (unsigned char) dwGray;
}
break;
}
for( y = 0; y < pOldBIH->biHeight; y++ )
{
pTemp = pOldBits; //位圖數據起始指針
pTemp += y * nOldWidthBytes; //位圖數據下一行起始指針
//轉換成灰度索引
for( x = 0; x < pOldBIH->biWidth; x++ ) pTemp[x] = pLookup[pTemp[x]];
}
delete [] pLookup; //釋放pLookup查找表所占內存
memcpy( pNewBits, pOldBits, nNewWidthBytes * m_pDibObject->GetHeight());
break;
case 16: //16位色真彩色圖像
unsigned char ucRed, ucGreen, ucBlue;
for( y=0; y<pOldBIH->biHeight; y++ )
{
//位圖數據起始指針
pTemp = pOldBits;
pNewTemp = pNewBits;
//位圖數據下一行起始指針
pTemp += y * nOldWidthBytes;
pNewTemp += y * nNewWidthBytes;
switch( mGrayType )
{
case 0:
for( x=0; x<pOldBIH->biWidth; x++ )
{
GETRGB555( ucRed, ucGreen, ucBlue, &pTemp[x*2] );
//按亮度Y=0.3R+0.59G+0.11B將彩色圖像轉換為灰度圖像
dwGray = (ucRed * 30 + ucGreen * 59 +ucBlue * 11) / 100;
//給新圖像數據賦值
pNewTemp[x] = (unsigned char)dwGray;
}
break;
case 1:
for( x=0; x<pOldBIH->biWidth; x++ )
{
GETRGB555( ucRed, ucGreen, ucBlue, &pTemp[x*2] );
//按亮度Y=R將彩色圖像轉換為灰度圖像
dwGray = (ucRed * 30 + ucGreen * 59 +ucBlue * 11) / 100;
//給新圖像數據賦值
pNewTemp[x] = (unsigned char)dwGray;
}
break;
case 2:
for( x=0; x<pOldBIH->biWidth; x++ )
{
GETRGB555( ucRed, ucGreen, ucBlue, &pTemp[x*2] );
//按亮度Y=G將彩色圖像轉換為灰度圖像
dwGray = (ucRed * 30 + ucGreen * 59 +ucBlue * 11) / 100;
//給新圖像數據賦值
pNewTemp[x] = (unsigned char)dwGray;
}
break;
case 3:
for( x=0; x<pOldBIH->biWidth; x++ )
{
GETRGB555( ucRed, ucGreen, ucBlue, &pTemp[x*2] );
//按亮度Y=B將彩色圖像轉換為灰度圖像
dwGray = (ucRed * 30 + ucGreen * 59 +ucBlue * 11) / 100;
//給新圖像數據賦值
pNewTemp[x] = (unsigned char)dwGray;
}
break;
}
}
break;
case 24: //24位真彩色圖像
for( y=0; y<pOldBIH->biHeight; y++ )
{
//位圖數據起始指針
pTemp = pOldBits;
pNewTemp = pNewBits;
//位圖數據下一行起始指針
pTemp += y * nOldWidthBytes;
pNewTemp += y * nNewWidthBytes;
switch( mGrayType )
{
case 0: //按亮度Y=0.3R+0.59G+0.11B將彩色圖像轉換為灰度圖像
for( x=0; x<pOldBIH->biWidth; x++ )
{
dwGray = ( (DWORD) pTemp[x*3+2] * 30 //紅色
+(DWORD) pTemp[x*3+1] * 59 //綠色
+(DWORD) pTemp[x*3] * 11 //蘭色
) / 100;
//給新圖像數據賦值
pNewTemp[x] = (unsigned char)dwGray;
}
break;
case 1: //按亮度Y=R將彩色圖像轉換為灰度圖像
for( x=0; x<pOldBIH->biWidth; x++ )
{
dwGray = (DWORD) pTemp[x*3+2]; //紅色
//給新圖像數據賦值
pNewTemp[x] = (unsigned char)dwGray;
}
break;
case 2: //按亮度Y=G將彩色圖像轉換為灰度圖像
for( x=0; x<pOldBIH->biWidth; x++ )
{
dwGray = (DWORD) pTemp[x*3+1] ; //綠色
//給新圖像數據賦值
pNewTemp[x] = (unsigned char)dwGray;
}
break;
case 3: //按亮度Y=B將彩色圖像轉換為灰度圖像
for( x=0; x<pOldBIH->biWidth; x++ )
{
dwGray =(DWORD) pTemp[x*3]; //蘭色
//給新圖像數據賦值
pNewTemp[x] = (unsigned char)dwGray;
}
break;
}
}
break;
case 32: //32位真彩色圖像
for( y=0; y<pOldBIH->biHeight; y++ )
{
//位圖數據起始指針
pTemp = pOldBits;
pNewTemp = pNewBits;
//位圖數據下一行起始指針
pTemp += y * nOldWidthBytes;
pNewTemp += y * nNewWidthBytes;
switch( mGrayType )
{
case 0:
for( x=0; x<pOldBIH->biWidth; x++ )
{
//按亮度Y=0.3R+0.59G+0.11B將彩色圖像轉換為灰度圖像
dwGray = ( (DWORD) pTemp[x*4] * 30 //紅色
+(DWORD) pTemp[x*4+1] * 59 //綠色
+(DWORD) pTemp[x*4+2] * 11 //蘭色
) / 100;
//給新圖像數據賦值
pNewTemp[x] = (unsigned char)dwGray;
}
break;
case 1:
for( x=0; x<pOldBIH->biWidth; x++ )
{
//按亮度Y=R將彩色圖像轉換為灰度圖像
dwGray = (DWORD) pTemp[x*4];//紅色
//給新圖像數據賦值
pNewTemp[x] = (unsigned char)dwGray;
}
break;
case 2:
for( x=0; x<pOldBIH->biWidth; x++ )
{
//按亮度Y=G將彩色圖像轉換為灰度圖像
dwGray = (DWORD) pTemp[x*4+1] ; //綠色
//給新圖像數據賦值
pNewTemp[x] = (unsigned char)dwGray;
}
break;
case 3:
for( x=0; x<pOldBIH->biWidth; x++ )
{
//按亮度Y=B將彩色圖像轉換為灰度圖像
dwGray =(DWORD) pTemp[x*4+2] ; //蘭色
//給新圖像數據賦值
pNewTemp[x] = (unsigned char)dwGray;
}
break;
}
}
break;
}
::GlobalUnlock( m_pDibObject->GetDib() );
::GlobalFree( m_pDibObject->GetDib() );
::GlobalUnlock( hGlobal );
m_pDibObject->SetDib( hGlobal );
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -