⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 makecolordib.cpp

📁 VC++图像处理程序设计课本和代码.
💻 CPP
📖 第 1 页 / 共 3 页
字号:
// 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 + -