📄 makecolordib.cpp
字号:
// MakeColorDib.cpp: implementation of the MakeColorDib class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "DSplit.h"
#include "MakeColorDib.h"
#include "MainFrm.h"
#include "math.h"
#define BOUND(x,a,b) (((x) < (a)) ? (a) : (((x) > (b)) ? (b) : (x)))
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
MakeColorDib::MakeColorDib()
{
}
MakeColorDib::~MakeColorDib()
{
}
/***************************************************************/
/*函数名称:MakegGray() */
/*函数类型:void */
/*功能:真彩色转化成256色灰度图像。 */
/***************************************************************/
void MakeColorDib::MakegGray() //灰度变化
{
BYTE *p_data; //原图数据区指针
int wide,height,DibWidth; //原图长、宽、字节宽
p_data=this->GetData (); //取得原图的数据区指针
wide=this->GetWidth (); //取得原图的数据区宽度
height=this->GetHeight (); //取得原图的数据区高度
DibWidth=this->GetDibWidthBytes(); //取得原图的每行字节数
for(int j=0;j<height;j++) // 每行
for(int i=0;i<DibWidth;i+=3) // 每列
{
BYTE* pbyBlue = p_data++; //得到蓝色值
BYTE* pbyGreen = p_data++; //得到绿色值
BYTE* pbyRed = p_data++; //得到红色值
BYTE r = *pbyRed;
BYTE g = *pbyGreen;
BYTE b = *pbyBlue;
//取到原r,g,b中的最大值作为像素三分量值的新值
int gray=0;
if(r>g)
gray=r;
else
gray=g;
if(gray<b)
gray=b;
*pbyBlue = gray; //将取到的最大值赋给像素的蓝分量
*pbyGreen = gray; //将取到的最大值赋给像素的绿分量
*pbyRed = gray; //将取到的最大值赋给像素的红分量
}
}
/***************************************************************/
/*函数名称:LightAlter(int m_Light) */
/*函数类型:void */
/*参数:int m_Light,用户给定的阈值 */
/*功能:对图像使用阈值法进行亮度调整。 */
/***************************************************************/
void MakeColorDib::LightAlter(int m_Light) //亮度调整
{
BYTE *p_data; //原图数据区指针
int wide,height,DibWidth; //原图长、宽、字节宽
p_data=this->GetData (); //取得原图的数据区指针
wide=this->GetWidth (); //取得原图的数据区宽度
height=this->GetHeight (); //取得原图的数据区高度
DibWidth=this->GetDibWidthBytes(); //取得原图的每行字节数
for(int j=0;j<height;j++) // 每行
for(int i=0;i<DibWidth;i++) // 每列
{
int a=0;
a=int(*p_data*m_Light/100); //调整当前点的亮度
*p_data=a;
//判断范围,取得合理的值
if(a<0)
*p_data=0;
if(a>255)
*p_data=255;
p_data++; //指向下一指针
}
}
/***************************************************************/
/*函数名称:LightReverse() */
/*函数类型:void */
/*功能:图像的亮度取反。 */
/***************************************************************/
void MakeColorDib::LightReverse() //亮度取反
{
BYTE *p_data; //原图数据区指针
int wide,height,DibWidth; //原图长、宽、字节宽
p_data=this->GetData (); //取得原图的数据区指针
wide=this->GetWidth (); //取得原图的数据区宽度
height=this->GetHeight (); //取得原图的数据区高度
DibWidth=this->GetDibWidthBytes(); //取得原图的每行字节数
for(int j=0;j<height;j++) // 每行
for(int i=0;i<DibWidth;i++) // 每列
{
int a=*p_data; //取得当前点的值
*p_data=255-a; //取反
p_data++; //指向下一指针
}
}
/***************************************************************/
/*函数名称:ContrastAlter(int m_Increment) */
/*函数类型:void */
/*参数:int m_Increment,用户给定的阈值 */
/*功能:对图像使用阈值法调整对比度处理。 */
/***************************************************************/
void MakeColorDib::ContrastAlter(int m_Increment) ///对比度处理
{
int nHigh = 255 - m_Increment;
//对于极端情况加以处理
if(nHigh < m_Increment)
{
nHigh = 127;
m_Increment = 120;
}
if(m_Increment < -127)
m_Increment = -120;
//扩展或压缩区间的长度
int nStretch = 255;
if(m_Increment >= 0)
nStretch = 255 - 2 * m_Increment;
else
nStretch = 255 + 2 * m_Increment;
BYTE *p_data; //原图数据区指针
int wide,height,DibWidth; //原图长、宽、字节宽
p_data=this->GetData (); //取得原图的数据区指针
wide=this->GetWidth (); //取得原图的数据区宽度
height=this->GetHeight (); //取得原图的数据区高度
DibWidth=this->GetDibWidthBytes(); //取得原图的每行字节数
if(m_Increment >= 0) // m_Increment>=0时
{
for(int j=0;j<height;j++) // 每行
for(int i=0;i<DibWidth-3;i+=3) // 每列
{
//取得当前点(蓝色)的值,调整
BYTE* pbyBlue = p_data++;
if(*pbyBlue<=m_Increment)
*pbyBlue=0;
else if(*pbyBlue>nHigh)
*pbyBlue=255;
else
*pbyBlue=(BYTE)((((int)*pbyBlue - m_Increment) * 255) / nStretch );
//取得当前点(绿色)的值,调整
BYTE* pbyGreen = p_data++;
if(*pbyGreen<=m_Increment)
*pbyGreen=0;
else if(*pbyGreen>nHigh)
*pbyGreen=255;
else
*pbyGreen=(BYTE)((((int)*pbyGreen - m_Increment) * 255) / nStretch );
//取得当前点(红色)的值,调整
BYTE* pbyRed = p_data++;
if(*pbyRed<=m_Increment)
*pbyRed=0;
else if(*pbyRed>nHigh)
*pbyRed=255;
else
*pbyRed=(BYTE)((((int)*pbyRed - m_Increment) * 255) / nStretch );
}
}
else // m_Increment < 0 时
{
for(int j=0;j<height;j++)
for(int i=0;i<DibWidth-3;i+=3)
{ //取得当前点(蓝色)的值,调整
BYTE* pbyBlue = p_data++;
*pbyBlue = (BYTE)((((int)(*pbyBlue) * nStretch) / 255) - m_Increment);
//取得当前点(红色)的值,调整
BYTE* pbyGreen = p_data++;
*pbyGreen = (BYTE)((((int)(*pbyGreen) * nStretch) / 255) - m_Increment);
//取得当前点(红色)的值,调整
BYTE* pbyRed = p_data++;
*pbyRed = (BYTE)((((int)(*pbyRed) * nStretch) / 255) - m_Increment);
}
}
}
/***************************************************************/
/*函数名称:Exposal() */
/*函数类型:void */
/*功能:图像曝光处理。 */
/***************************************************************/
void MakeColorDib::Exposal() //曝光处理
{
BYTE *p_data; //原图数据区指针
int wide,height,DibWidth; //原图长、宽、字节宽
p_data=this->GetData (); //取得原图的数据区指针
wide=this->GetWidth (); //取得原图的数据区宽度
height=this->GetHeight (); //取得原图的数据区高度
DibWidth=this->GetDibWidthBytes(); //取得原图的每行字节数
for(int j=0;j<height;j++) // 每行
for(int i=0;i<DibWidth;i++) // 每列
{
BYTE* pbydata = p_data++; //取得当前点的值
BYTE a=*pbydata; //传给临时变量
*pbydata=(a>128)?a:(255-a); //调整
}
}
/***************************************************************/
/*函数名称:PaintColor(int m_Red,int m_Green,int m_Blue) */
/*函数类型:void */
/*参数:int m_Red、m_Green、m_Blue,用户给定的红绿蓝值 */
/*功能:对图像使用阈值法进行着色处理。 */
/***************************************************************/
void MakeColorDib::PaintColor(int m_Red,int m_Green,int m_Blue) //着色处理
{
BYTE *p_data; //原图数据区指针
int wide,height,DibWidth; //原图长、宽、字节宽
p_data=this->GetData (); //取得原图的数据区指针
wide=this->GetWidth (); //取得原图的数据区宽度
height=this->GetHeight (); //取得原图的数据区高度
DibWidth=this->GetDibWidthBytes(); //取得原图的每行字节数
for(int j=0;j<height;j++) // 每行
for(int i=0;i<DibWidth;i+=3) // 每列
{
BYTE* pbyBlue = p_data++; //取得当前点(蓝色)的值
BYTE* pbyGreen = p_data++; //取得当前点(绿色)的值
BYTE* pbyRed = p_data++; //取得当前点(红色)的值
BYTE r = *pbyRed;
BYTE g = *pbyGreen;
BYTE b = *pbyBlue;
BYTE gray=(BYTE)(((WORD)r * 59 + (WORD)g * 30 + (WORD)b * 11) / 100);
*pbyBlue = (BYTE)((m_Blue * gray) / 255);
*pbyGreen = (BYTE)((m_Green * gray) / 255);
*pbyRed = (BYTE)((m_Red * gray) / 255);
}
}
/***************************************************************/
/*函数名称:NeonLight() */
/*函数类型:void */
/*功能:使图像产生霓虹处理效果。 */
/***************************************************************/
void MakeColorDib::NeonLight() //霓虹处理
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -