📄 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 + -