?? 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()
{
}
/***************************************************************/
/*函數(shù)名稱:MakegGray() */
/*函數(shù)類型:void */
/*功能:真彩色轉(zhuǎn)化成256色灰度圖像。 */
/***************************************************************/
void MakeColorDib::MakegGray() //灰度變化
{
BYTE *p_data; //原圖數(shù)據(jù)區(qū)指針
int wide,height,DibWidth; //原圖長、寬、字節(jié)寬
p_data=this->GetData (); //取得原圖的數(shù)據(jù)區(qū)指針
wide=this->GetWidth (); //取得原圖的數(shù)據(jù)區(qū)寬度
height=this->GetHeight (); //取得原圖的數(shù)據(jù)區(qū)高度
DibWidth=this->GetDibWidthBytes(); //取得原圖的每行字節(jié)數(shù)
for(int j=0;j<height;j++) // 每行
for(int i=0;i<DibWidth;i+=3) // 每列
{
BYTE* pbyBlue = p_data++; //得到藍(lán)色值
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; //將取到的最大值賦給像素的藍(lán)分量
*pbyGreen = gray; //將取到的最大值賦給像素的綠分量
*pbyRed = gray; //將取到的最大值賦給像素的紅分量
}
}
/***************************************************************/
/*函數(shù)名稱:LightAlter(int m_Light) */
/*函數(shù)類型:void */
/*參數(shù):int m_Light,用戶給定的閾值 */
/*功能:對圖像使用閾值法進(jìn)行亮度調(diào)整。 */
/***************************************************************/
void MakeColorDib::LightAlter(int m_Light) //亮度調(diào)整
{
BYTE *p_data; //原圖數(shù)據(jù)區(qū)指針
int wide,height,DibWidth; //原圖長、寬、字節(jié)寬
p_data=this->GetData (); //取得原圖的數(shù)據(jù)區(qū)指針
wide=this->GetWidth (); //取得原圖的數(shù)據(jù)區(qū)寬度
height=this->GetHeight (); //取得原圖的數(shù)據(jù)區(qū)高度
DibWidth=this->GetDibWidthBytes(); //取得原圖的每行字節(jié)數(shù)
for(int j=0;j<height;j++) // 每行
for(int i=0;i<DibWidth;i++) // 每列
{
int a=0;
a=int(*p_data*m_Light/100); //調(diào)整當(dāng)前點(diǎn)的亮度
*p_data=a;
//判斷范圍,取得合理的值
if(a<0)
*p_data=0;
if(a>255)
*p_data=255;
p_data++; //指向下一指針
}
}
/***************************************************************/
/*函數(shù)名稱:LightReverse() */
/*函數(shù)類型:void */
/*功能:圖像的亮度取反。 */
/***************************************************************/
void MakeColorDib::LightReverse() //亮度取反
{
BYTE *p_data; //原圖數(shù)據(jù)區(qū)指針
int wide,height,DibWidth; //原圖長、寬、字節(jié)寬
p_data=this->GetData (); //取得原圖的數(shù)據(jù)區(qū)指針
wide=this->GetWidth (); //取得原圖的數(shù)據(jù)區(qū)寬度
height=this->GetHeight (); //取得原圖的數(shù)據(jù)區(qū)高度
DibWidth=this->GetDibWidthBytes(); //取得原圖的每行字節(jié)數(shù)
for(int j=0;j<height;j++) // 每行
for(int i=0;i<DibWidth;i++) // 每列
{
int a=*p_data; //取得當(dāng)前點(diǎn)的值
*p_data=255-a; //取反
p_data++; //指向下一指針
}
}
/***************************************************************/
/*函數(shù)名稱:ContrastAlter(int m_Increment) */
/*函數(shù)類型:void */
/*參數(shù):int m_Increment,用戶給定的閾值 */
/*功能:對圖像使用閾值法調(diào)整對比度處理。 */
/***************************************************************/
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;
//擴(kuò)展或壓縮區(qū)間的長度
int nStretch = 255;
if(m_Increment >= 0)
nStretch = 255 - 2 * m_Increment;
else
nStretch = 255 + 2 * m_Increment;
BYTE *p_data; //原圖數(shù)據(jù)區(qū)指針
int wide,height,DibWidth; //原圖長、寬、字節(jié)寬
p_data=this->GetData (); //取得原圖的數(shù)據(jù)區(qū)指針
wide=this->GetWidth (); //取得原圖的數(shù)據(jù)區(qū)寬度
height=this->GetHeight (); //取得原圖的數(shù)據(jù)區(qū)高度
DibWidth=this->GetDibWidthBytes(); //取得原圖的每行字節(jié)數(shù)
if(m_Increment >= 0) // m_Increment>=0時(shí)
{
for(int j=0;j<height;j++) // 每行
for(int i=0;i<DibWidth-3;i+=3) // 每列
{
//取得當(dāng)前點(diǎn)(藍(lán)色)的值,調(diào)整
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 );
//取得當(dāng)前點(diǎn)(綠色)的值,調(diào)整
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 );
//取得當(dāng)前點(diǎn)(紅色)的值,調(diào)整
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 時(shí)
{
for(int j=0;j<height;j++)
for(int i=0;i<DibWidth-3;i+=3)
{ //取得當(dāng)前點(diǎn)(藍(lán)色)的值,調(diào)整
BYTE* pbyBlue = p_data++;
*pbyBlue = (BYTE)((((int)(*pbyBlue) * nStretch) / 255) - m_Increment);
//取得當(dāng)前點(diǎn)(紅色)的值,調(diào)整
BYTE* pbyGreen = p_data++;
*pbyGreen = (BYTE)((((int)(*pbyGreen) * nStretch) / 255) - m_Increment);
//取得當(dāng)前點(diǎn)(紅色)的值,調(diào)整
BYTE* pbyRed = p_data++;
*pbyRed = (BYTE)((((int)(*pbyRed) * nStretch) / 255) - m_Increment);
}
}
}
/***************************************************************/
/*函數(shù)名稱:Exposal() */
/*函數(shù)類型:void */
/*功能:圖像曝光處理。 */
/***************************************************************/
void MakeColorDib::Exposal() //曝光處理
{
BYTE *p_data; //原圖數(shù)據(jù)區(qū)指針
int wide,height,DibWidth; //原圖長、寬、字節(jié)寬
p_data=this->GetData (); //取得原圖的數(shù)據(jù)區(qū)指針
wide=this->GetWidth (); //取得原圖的數(shù)據(jù)區(qū)寬度
height=this->GetHeight (); //取得原圖的數(shù)據(jù)區(qū)高度
DibWidth=this->GetDibWidthBytes(); //取得原圖的每行字節(jié)數(shù)
for(int j=0;j<height;j++) // 每行
for(int i=0;i<DibWidth;i++) // 每列
{
BYTE* pbydata = p_data++; //取得當(dāng)前點(diǎn)的值
BYTE a=*pbydata; //傳給臨時(shí)變量
*pbydata=(a>128)?a:(255-a); //調(diào)整
}
}
/***************************************************************/
/*函數(shù)名稱:PaintColor(int m_Red,int m_Green,int m_Blue) */
/*函數(shù)類型:void */
/*參數(shù):int m_Red、m_Green、m_Blue,用戶給定的紅綠藍(lán)值 */
/*功能:對圖像使用閾值法進(jìn)行著色處理。 */
/***************************************************************/
void MakeColorDib::PaintColor(int m_Red,int m_Green,int m_Blue) //著色處理
{
BYTE *p_data; //原圖數(shù)據(jù)區(qū)指針
int wide,height,DibWidth; //原圖長、寬、字節(jié)寬
p_data=this->GetData (); //取得原圖的數(shù)據(jù)區(qū)指針
wide=this->GetWidth (); //取得原圖的數(shù)據(jù)區(qū)寬度
height=this->GetHeight (); //取得原圖的數(shù)據(jù)區(qū)高度
DibWidth=this->GetDibWidthBytes(); //取得原圖的每行字節(jié)數(shù)
for(int j=0;j<height;j++) // 每行
for(int i=0;i<DibWidth;i+=3) // 每列
{
BYTE* pbyBlue = p_data++; //取得當(dāng)前點(diǎn)(藍(lán)色)的值
BYTE* pbyGreen = p_data++; //取得當(dāng)前點(diǎn)(綠色)的值
BYTE* pbyRed = p_data++; //取得當(dāng)前點(diǎn)(紅色)的值
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);
}
}
/***************************************************************/
/*函數(shù)名稱:NeonLight() */
/*函數(shù)類型:void */
/*功能:使圖像產(chǎn)生霓虹處理效果。 */
/***************************************************************/
void MakeColorDib::NeonLight() //霓虹處理
{
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -