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