📄 pointpro.cpp
字号:
pTemp[0] = pMap[pTemp[0]];
pTemp[1] = pMap[pTemp[1]];
pTemp[2] = pMap[pTemp[2]];
pTemp[3] = pMap[pTemp[3]];
pTemp += 4;
}
}
break;
}
delete [] pMap;
::GlobalUnlock( m_pDibObject->GetDib() );
m_pDibObject->m_nLastError = IMAGELIB_SUCCESS;
// 返回
return TRUE;
}
////////////////////////////////////////////////////////////////////////
//BOOL GrayStretch()
//----------------------------------------------------------------------
//基本功能:本函数对传入的CDibObject对象中的图像进行灰度拉伸变换。如果
// 进行此调整之前没有指定一个CDibObject对象指针,则必须在调整
// 时加以指定。任何未传入的坐标值或默认的-1坐标值都将被置为图像
// 的最大值或最大植。变量nX1和nY1将被置为0,nX2将被置为图像宽度
// 减1,nY2将被置为图像高度减1。想要在整个图像上进行操作时,最
// 好的方法是不传入nX1、nY1、nX2和nY2值。这样它们会被默认为整个
// 图像。
//----------------------------------------------------------------------
//参数说明:BYTE bX1 灰度拉伸第一个点的x坐标
// BYTE bY1 灰度拉伸第一个点的y坐标
// BYTE bX2 灰度拉伸第二个点的x坐标
// BYTE bY2 灰度拉伸第二个点的y坐标
// int nX1, 默认为-1
// int nY1, 默认为-1
// int nX2, 默认为-1
// int nY2, 默认为-1
// CDibObject *pDibObject, 默认为NULL
//----------------------------------------------------------------------
//返回:BOOL:成功返回TRUE,失败返回FALSE。
//----------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////
BOOL CPointPro::GrayStretch(BYTE bX1,
BYTE bY1,
BYTE bX2,
BYTE bY2,
int nX1,
int nY1,
int nX2,
int nY2,
CDibObject *pDibObject)
{
//创建灰度映射表
unsigned char *pMap = DoublePointLinerTran(bX1, bY1, bX2, bY2);
//CDibObject对象指针
if( pDibObject != NULL ) m_pDibObject = pDibObject;
//若未指定 CDibObject 对象指针返回FALSE
if( m_pDibObject == NULL ) return( FALSE );
BOOL bLessThanHalf, bCompleteImage;
m_pDibObject->NormalizeCoordinates( &nX1, &nY1, &nX2, &nY2,
&bCompleteImage,
&bLessThanHalf );
//定义变量
unsigned char *pBuffer, *pBits, *pTemp;
BITMAPINFOHEADER *pBIH;
RGBQUAD *pPalette;
int nWidthBytes, nNumColors, x, y, i;
//pBuffer: 获得位图数据指针
pBuffer = (unsigned char *) m_pDibObject->GetDIBPointer( &nWidthBytes,
m_pDibObject->GetNumBits() );
if( pBuffer == NULL ) return( FALSE );
//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)];
LOGPALETTE *pLogPal = m_pDibObject->GetLogPal();
CPalette *_pPalette = m_pDibObject->GetPalette();
switch( m_pDibObject->GetNumBits() )
{
case 1:
for( y=nY1; y<=nY2; y++ )
{
unsigned char Mask;
pTemp = pBits;
pTemp += ( ( ( m_pDibObject->GetHeight() - 1 - y )
* nWidthBytes ) + ( nX1 / 8 ) );
for( x=nX1; x<=nX2; x++ )
{
Mask = 0x80 >> ( x & 7 );
if( pTemp[0] & Mask ) pTemp[0] &= ( Mask ^ 0xff );
else pTemp[0] |= Mask;
if( ( x & 7 ) == 7 ) pTemp++;
}
}
break;
case 4:
if( bCompleteImage )
{
_pPalette->DeleteObject();
for( i=0; i<nNumColors; i++ )
{
pPalette[i].rgbRed = pMap[pPalette[i].rgbRed];
pPalette[i].rgbGreen = pMap[pPalette[i].rgbGreen];
pPalette[i].rgbBlue = pMap[pPalette[i].rgbBlue];
}
LOGPALETTE *pLogPal = m_pDibObject->CreateLogPalette(
pPalette, nNumColors );
if( pLogPal != NULL )
{
_pPalette->CreatePalette( pLogPal );
delete [] pLogPal;
}
}
else
{
unsigned char ucRed, ucGreen, ucBlue, Data;
for( y=nY1; y<=nY2; y++ )
{
pTemp = pBits;
pTemp += ( ( ( m_pDibObject->GetHeight() - 1 - y )
* nWidthBytes ) + ( nX1 / 2 ) );
for( x=nX1; x<=nX2; x++ )
{
Data = *pTemp;
if( !( x & 1 ) ) Data >>= 4;
else Data &= 0x0f;
ucRed = pPalette[Data].rgbRed;
ucGreen = pPalette[Data].rgbGreen;
ucBlue = pPalette[Data].rgbBlue;
ucRed = pMap[ucRed];
ucGreen = pMap[ucGreen];
ucBlue = pMap[ucBlue];
Data = (unsigned char) m_pDibObject->GetNearestIndex( ucRed, ucGreen,
ucBlue, pPalette, nNumColors );
if( !( x & 1 ) )
{
Data <<= 4;
(*pTemp) &= 0x0f;
(*pTemp) |= Data;
}
else
{
(*pTemp) &= 0xf0;
(*pTemp) |= Data;
pTemp++;
}
}
}
}
break;
case 8:
if( bCompleteImage )
{
_pPalette->DeleteObject();
for( i=0; i<nNumColors; i++ )
{
pPalette[i].rgbRed = pMap[pPalette[i].rgbRed];
pPalette[i].rgbGreen = pMap[pPalette[i].rgbGreen];
pPalette[i].rgbBlue = pMap[pPalette[i].rgbBlue];
}
LOGPALETTE *pLogPal = m_pDibObject->CreateLogPalette( pPalette, nNumColors );
if( pLogPal != NULL )
{
_pPalette->CreatePalette( pLogPal );
delete [] pLogPal;
}
}
else
{
unsigned char ucRed, ucGreen, ucBlue, Data;
for( y=nY1; y<=nY2; y++ )
{
pTemp = pBits;
pTemp += ( ( ( m_pDibObject->GetHeight() - 1 - y )
* nWidthBytes ) + nX1 );
for( x=nX1; x<=nX2; x++ )
{
Data = *pTemp;
ucRed = pPalette[Data].rgbRed;
ucGreen = pPalette[Data].rgbGreen;
ucBlue = pPalette[Data].rgbBlue;
ucRed = pMap[ucRed];
ucGreen = pMap[ucGreen];
ucBlue = pMap[ucBlue];
Data = (unsigned char) m_pDibObject->GetNearestIndex( ucRed,
ucGreen, ucBlue, pPalette, nNumColors );
*pTemp++ = Data;
}
}
}
break;
case 16:
unsigned char ucRed, ucGreen, ucBlue;
for( y=0; y< nY2; y++ )
{
pTemp = pBits;
pTemp += ( ( m_pDibObject->GetHeight() - 1 - y )
* nWidthBytes );
pTemp += ( nX1 * 2 );
for( x=nX1; x<=nX2; x++ )
{
GETRGB555( ucRed, ucGreen, ucBlue, pTemp );
ucRed = pMap[ucRed];
ucGreen = pMap[ucGreen];
ucBlue = pMap[ucBlue];
PUTRGB555( ucRed, ucGreen, ucBlue, pTemp );
pTemp += 2;
}
}
break;
case 24:
for( y=nY1; y<=nY2; y++ )
{
pTemp = pBits;
pTemp += ( ( ( m_pDibObject->GetHeight() - 1 - y )
* nWidthBytes ) + ( nX1 * 3 ) );
for( x=nX1; x<=nX2; x++ )
{
pTemp[0] = pMap[pTemp[0]];
pTemp[1] = pMap[pTemp[1]];
pTemp[2] = pMap[pTemp[2]];
pTemp += 3;
}
}
break;
case 32:
for( y=nY1; y<=nY2; y++ )
{
pTemp = pBits;
pTemp += ( ( ( m_pDibObject->GetHeight() - 1 - y )
* nWidthBytes ) + ( nX1 * 4 ) );
for( x=nX1; x<=nX2; x++ )
{
pTemp[0] = pMap[pTemp[0]];
pTemp[1] = pMap[pTemp[1]];
pTemp[2] = pMap[pTemp[2]];
pTemp[3] = pMap[pTemp[3]];
pTemp += 4;
}
}
break;
}
delete [] pMap;
::GlobalUnlock( m_pDibObject->GetDib() );
m_pDibObject->m_nLastError = IMAGELIB_SUCCESS;
// 返回
return TRUE;
}
////////////////////////////////////////////////////////////////////////
//BOOL InteEqualize(CDibObject *pDibObject)
//----------------------------------------------------------------------
//基本功能:本函数对传入的CDibObject对象中的图像进行直方图均衡。
//----------------------------------------------------------------------
//参数说明:CDibObject *pDibObject, 默认为NULL
//----------------------------------------------------------------------
//返回:BOOL:成功返回TRUE,失败返回FALSE。
//----------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////
BOOL CPointPro::InteEqualize(CDibObject *pDibObject)
{
//CDibObject对象指针
if( pDibObject != NULL ) m_pDibObject = pDibObject;
//若未指定 CDibObject 对象指针返回FALSE
if( m_pDibObject == NULL ) return( FALSE );
//只处理8位图像
if(m_pDibObject->GetNumBits() != 8)
{
AfxMessageBox("目前只支持8位灰度图像的处理!");
return( FALSE );
}
//定义变量
unsigned char *pBuffer, *pBits, *pTemp;
BITMAPINFOHEADER *pBIH;
RGBQUAD *pPalette;
int nWidthBytes, nNumColors, x, y;
int nWidth = m_pDibObject->GetWidth();
int nHeight = m_pDibObject->GetHeight();
//pBuffer: 获得位图数据指针
pBuffer = (unsigned char *) m_pDibObject->GetDIBPointer( &nWidthBytes,
m_pDibObject->GetNumBits() );
if( pBuffer == NULL ) return( FALSE );
//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 *pHistogram = GetHistogram();
// 灰度映射表
BYTE bMap[256];
int i, j;
for(i = 0; i < 256; i++)
{
bMap[i] = 0;
}
// 计算灰度映射表
for (i = 0; i < 256; i++)
{
// 初始为0
long lTemp = 0;
for (j = 0; j <= i ; j++)
{
lTemp += pHistogram[j];
}
// 计算对应的新灰度值
bMap[i] = (BYTE) (lTemp * 255 / nHeight / nWidth);
}
delete [] pHistogram;
for(y = 0; y < nHeight; y++)
{
pTemp = pBits;
pTemp += y * nWidthBytes; //位图数据下一行起始指针
for(x = 0; x < nWidth; x++)
{
long lpSrc = pTemp[x];
// 计算新的灰度值
pTemp[x] = bMap[lpSrc];
}
}
::GlobalUnlock( m_pDibObject->GetDib() );
// 返回
return TRUE;
}
////////////////////////////////////////////////////////////////////////
//BOOL ReplaceColorPal()
//----------------------------------------------------------------------
//基本功能:本函数对传入的CDibObject对象中的图像用指定的伪彩色编码表来
// 替换图像的调试板。
//----------------------------------------------------------------------
//参数说明:CDibObject *pDibObject, 默认为NULL
// BYTE * bpColorsTable - 伪彩色编码表
//----------------------------------------------------------------------
//返回:BOOL:成功返回TRUE,失败返回FALSE。
//----------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////
BOOL CPointPro::ReplaceColorPal(CDibObject *pDibObject,
BYTE *bpColorsTable)
{
//CDibObject对象指针
if( pDibObject != NULL ) m_pDibObject = pDibObject;
//若未指定 CDibObject 对象指针返回FALSE
if( m_pDibObject == NULL ) return( FALSE );
//定义变量
unsigned char *pBuffer;
BITMAPINFOHEADER *pBIH;
RGBQUAD *pPalette;
int nWidthBytes, nNumColors;
//pBuffer: 获得位图数据指针
pBuffer = (unsigned char *) m_pDibObject->GetDIBPointer( &nWidthBytes,
m_pDibObject->GetNumBits() );
if( pBuffer == NULL ) return( FALSE );
//pBIH:获得位图信息头地址
pBIH = (BITMAPINFOHEADER *) &pBuffer[sizeof(BITMAPFILEHEADER)];
//nNumColors:获得调色板中的颜色数。图像为16位色或更高时为0
nNumColors = m_pDibObject->GetNumColors();
//pPalette:获得调色板数据地址
pPalette = (RGBQUAD *) &pBuffer[sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)];
//pBits:获得位图数据地址
// 读取伪彩色编码,更新DIB调色板
for(int i=0; i<256; i++ )
{
// 更新DIB调色板红色分量
pPalette[i].rgbRed = bpColorsTable[i * 4];
// 更新DIB调色板绿色分量
pPalette[i].rgbGreen = bpColorsTable[i * 4 + 1];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -