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

📄 imageprocess.cpp

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

#include "stdafx.h"
#include "ImageProcess.h"

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

IMPLEMENT_DYNAMIC(CImageProcess,  CObject)
CImageProcess::CImageProcess()
{
	m_dwOperation = 0L;	//缺省
	m_dwColorModel = IMAGE_COLOR_RGBA;
}

CImageProcess::~CImageProcess()
{

}

#ifdef _DEBUG
void CImageProcess::Dump(CDumpContext& dc) const
{
	CObject::Dump(dc);
}

void CImageProcess::AssertValid() const
{
	CObject::AssertValid();
}
#endif

//设置图像处理操作(虚拟)
void CImageProcess::SetOperation(DWORD dwOperation)
{
	m_dwOperation = dwOperation;
}


//设置颜色模型
//注意, 我们将只处理RGBA颜色模型
void CImageProcess::SetColorModel(DWORD dwColorModel)
{
	m_dwColorModel = dwColorModel;
}

DWORD CImageProcess::GetColorModel() const
{
	return m_dwColorModel;
}

DWORD CImageProcess::GetOperation() const
{
	return m_dwOperation;
}



//从一个32位无符号整数中获取颜色分量
BYTE CImageProcess::GetAlpha(DWORD dwRGBA)
{
	//四字节,顺序为A--B--G--R.
	//如果不是这一顺序, 请按重载该函数
	return (BYTE)((dwRGBA & 0xFF000000) >> 24); 	
}

BYTE CImageProcess::GetBlue(DWORD dwRGBA)
{
	return (BYTE)((dwRGBA & 0x000000FF) >> 16);
}

BYTE CImageProcess::GetGreen(DWORD dwRGBA)
{
	return (BYTE)((dwRGBA & 0x0000FF00) >> 8);
}
	
BYTE CImageProcess::GetRed(DWORD dwRGBA)
{
	return (BYTE)(dwRGBA & 0x00FF0000);
}

DWORD CImageProcess::PutRGBA(BYTE byRed,  BYTE byGreen,  BYTE byBlue,  BYTE byAlpha)
{
	return ((((DWORD)byAlpha) << 24) | 
		   (((DWORD)byRed) << 16)	|
		   (((DWORD)byGreen << 8)) |
		   ((DWORD)byBlue)) ;
}

DWORD CImageProcess::PutRGB(BYTE byRed,  BYTE byGreen,  BYTE byBlue)
{
	//不透明处理
	return ( 0xFF000000 | 
		   (((DWORD)byRed) << 16)	|
		   (((DWORD)byGreen) << 8) |
		   ((DWORD)byBlue)) ;
}

//从32位DDB数据直接创建一个DDB对象, 即HBITMAP对象
HBITMAP CImageProcess::CreateDdb(HDC hDC,  int nWidth,  int nHeight,  const LPBYTE lpbyBits32)
{
	//第一步, 创建一个BITMAPV4HEADER结构

	//分配内存:
	BYTE* pbyBits = new BYTE[sizeof(BITMAPV4HEADER)];
	if(pbyBits == NULL) return NULL;
	//指向Dib实际像素数据的指针, 
	BITMAPV4HEADER* pbmih = (BITMAPV4HEADER*)pbyBits;

	pbmih->bV4Size = sizeof(BITMAPV4HEADER);	//108
	pbmih->bV4Width = (LONG)nWidth;
	pbmih->bV4Height = (LONG)(-nHeight);
	pbmih->bV4Planes = 1;
	pbmih->bV4BitCount = 32;

    pbmih->bV4V4Compression = BI_RGB;    
	pbmih->bV4SizeImage = 0;
	pbmih->bV4XPelsPerMeter = 0;    
	pbmih->bV4YPelsPerMeter = 0;
	pbmih->bV4ClrUsed = 0;    
	pbmih->bV4ClrImportant = 0;
 
	//第二步, 创建一个DDB
	HBITMAP hBitmap = ::CreateDIBitmap(hDC, (BITMAPINFOHEADER*)pbmih, CBM_INIT, lpbyBits32, (BITMAPINFO*)pbmih, DIB_RGB_COLORS);

	delete[] pbyBits;
	return hBitmap;
}


⌨️ 快捷键说明

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