solarizationprocess.cpp

来自「visual c++数字图像与图形处理中的光盘内容」· C++ 代码 · 共 85 行

CPP
85
字号
/////////////////////////////////////////////////////////////////////////////////
//
// SolarizationProcess.cpp: implementation of the CSolarizationProcess class.
//
////////////////////////////////////////////////////////////////////////////////
// 版权所有(2002)
// Copyright(2002)
// 编写者: 向世明
// Author: Xiang Shiming


#include "stdafx.h"
#include "SolarizationProcess.h"


//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
IMPLEMENT_DYNAMIC(CSolarizationProcess,CImagePointProcess)
CSolarizationProcess::CSolarizationProcess()
{
	m_dwOperation = IMAGE_COLOR_SOLARIZE;
	m_byValve = 128;
}

CSolarizationProcess::~CSolarizationProcess()
{}

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

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

BOOL CSolarizationProcess::Solarize(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++;
			pbyRsc++;

			BYTE r = *pbyRed;
			BYTE g = *pbyGreen;
			BYTE b = *pbyBlue;
			*pbyBlue = (b < m_byValve) ? (255 - b) : b;
			*pbyGreen = (g < m_byValve) ? (255 - g) : g;
			*pbyRed = (r < m_byValve) ? (255 - r) : r;
		}
		dwBaseIndex += dwWidthBytes;
	}
	return TRUE;

}

void CSolarizationProcess::SetValve(BYTE byValveValue)
{
	m_byValve = byValveValue;
}

⌨️ 快捷键说明

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