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

📄 brightnessprocess.cpp

📁 visual c++数字图像与图形处理中的光盘内容
💻 CPP
字号:
/////////////////////////////////////////////////////////////////////////////////
//
// BrightnessProcess.cpp: implementation of the CBrightnessProcess class.
//
////////////////////////////////////////////////////////////////////////////////
// 版权所有(2002)
// Copyright(2002)
// 编写者: 向世明
// Author: Xiang Shiming


#include "stdafx.h"
#include "BrightnessProcess.h"


//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

IMPLEMENT_DYNAMIC(CBrightnessProcess, CImagePointProcess)
CBrightnessProcess::CBrightnessProcess()
{
	m_nPercentage = 100;		//亮度百分比
	m_byUpper = 0;			//上阀值
	m_byLower = 255;		//下阀值
}

CBrightnessProcess::~CBrightnessProcess()
{}

#ifdef _DEBUG
void CBrightnessProcess::Dump(CDumpContext& dc) const
{
	CImagePointProcess::Dump(dc);
}

void CBrightnessProcess::AssertValid() const
{
	CImagePointProcess::AssertValid();
}
#endif

void CBrightnessProcess::SetParam(int nPercentage,  BYTE byLower,  BYTE byUpper)
{
	m_nPercentage = nPercentage;
	m_byLower = byLower;
	m_byUpper = byUpper;

}

//图像点处理 改变单个像素点的亮度, 返回RGB
void CBrightnessProcess::Retrieve(BYTE* pbyBlue,  BYTE* pbyGreen,  BYTE* pbyRed)
{
	switch(m_dwOperation)
	{
		case IMAGE_BRIGHTNESS_PERCENTAGE:
		{
			int b = ((int)(*pbyBlue) * m_nPercentage) / 100;
			int g = ((int)(*pbyGreen) * m_nPercentage) / 100;
			int r = ((int)(*pbyRed) * m_nPercentage) / 100;

			*pbyBlue = (BYTE)BOUND(b, m_byLower, m_byUpper);
			*pbyGreen = (BYTE)BOUND(g, m_byLower, m_byUpper);
			*pbyRed = (BYTE)BOUND(r, m_byLower, m_byUpper);
			break;		
		}
		case IMAGE_BRIGHTNESS_REVERSE:
		{
			*pbyBlue = 255 - *pbyBlue; 
			*pbyGreen = 255 - *pbyGreen;
			*pbyRed = 255 - *pbyRed;
			break;
		}
		default: break;
	}
}

//改变指定区域(x, y, nWidth, nHeight)的亮度.
//nScanWidth表示数据扫描宽度, 以像素为单位, 而不是以字节为单位
//nScanHeight表示可扫描高度, 该参数主要用于合法性检验, 保证被处理的区域是合法区域.
//lpbyBits32--源数据----32位
//本来, 处理成DWORD数据最直观, 但显然速度没有BYTE快
//对应的DWORD格式应为A--R--G--B(从高位到低位), 这与通用的标准是一致的, 如Java

//BYTE型数据格式(依次):	B--G--R--A

BOOL CBrightnessProcess::ChangeBrightness(LPBYTE lpbyBits32,  int x,  int y,  int nWidth,  int nHeight,  int nScanWidth, int nScanHeight)
{
	ASSERT(lpbyBits32);
	//第一步, 进行参数合法性检测
	if((x > (nScanWidth - 1)) || (y > (nScanHeight - 1))) return FALSE;
	//有效区域的宽度和高度
	int w = min(nWidth, nScanWidth - x);
	int h = min(nHeight, nScanHeight - y);

	//行字节数
	DWORD dwWidthBytes = (DWORD)nScanWidth * 4;

	//开始数据基索引
	DWORD dwBaseIndex = y * dwWidthBytes + 4 * x;

	//第二步, 亮度修改
	for(int i = 0;i < h;i++)
	{
		BYTE* pbyRsc = lpbyBits32 + dwBaseIndex;

		for(int j = 0;j < w;j++)
		{
			BYTE* pbyBlue = pbyRsc++;
			BYTE* pbyGreen = pbyRsc++;
			BYTE* pbyRed = pbyRsc++;
			Retrieve(pbyBlue, pbyGreen, pbyRed);
			pbyRsc++;
		}
		dwBaseIndex += dwWidthBytes;
	}
	return TRUE;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -