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

📄 imagegeneraltransform.cpp

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

#include "stdafx.h"
#include "ImageGeneralTransform.h"

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
IMPLEMENT_DYNAMIC(CImageGeneralTransform,CImageGeometry)
CImageGeneralTransform::CImageGeneralTransform()
{
	m_dwOperation = IMAGE_GEOMETRY_GENERAL_TRANSFORM;
}

CImageGeneralTransform::~CImageGeneralTransform()
{

}

#ifdef _DEBUG
void CImageGeneralTransform::Dump(CDumpContext& dc) const
{
	CImageGeometry::Dump(dc);
}

void CImageGeneralTransform::AssertValid() const
{
	CImageGeometry::AssertValid();
}
#endif


BOOL CImageGeneralTransform::Transform(LPBYTE lpbyBitsSrc32, int x, int y, int nWidth, int nHeight, int nScanWidth, int nScanHeight, LPBYTE lpbyBitsDst32, int nWidthImgDst, int nHeightImgDst)
{
	//第一步,进行参数合法性检测
	ASSERT(lpbyBitsSrc32);
	ASSERT(lpbyBitsDst32);

	if((x > (nScanWidth - 1)) || (y > (nScanHeight - 1))) return FALSE;
	
	//有效区域的宽度和高度
	//请注意,这时,宽度和高度不得随意超过有效宽度和高度.

	if(nWidth > (nScanWidth - x)) 
	{
		::AfxMessageBox("The width of the area you defined is not obtained!");
		return FALSE;
	}
	if(nHeight > (nScanHeight - y)) 
	{
		::AfxMessageBox("The height of the area you defined is not obtained!");
		return FALSE;
	}

	DWORD dwWidthBytes = (DWORD)nScanWidth * 4;
	//指向目标数据
	BYTE* pbyDst = lpbyBitsDst32;
	//完成变换
	for(int i = 0; i < nHeightImgDst;i++)
	{

		for(int j = 0;j < nWidthImgDst;j++)
		{
			FLOATPOINT fp = GetInversePoint(j,i,nWidth,nHeight);

			//反向变换后获得的浮点x值
			float fXInverse = fp.x;
			//取整
			int xx = (int)fXInverse;

			//坐标差值
			float fu = fXInverse - xx;
			
			//对应于原图像的x坐标
			xx += x;

			//反向变换后获得的浮点y值
			float fYInverse = fp.y;
			//取整
			int yy = (int)fYInverse;

			//坐标差值
			float fv = fYInverse - yy;
			
			//对应于原图像的y坐标
			yy += y;

			//获取数据
			BYTE* pbySrc = lpbyBitsSrc32 + yy * dwWidthBytes + 4 * xx;

			//插值
			if((xx >= x) && (xx <= (x + nWidth - 1)) &&
			   (yy >= y) && (yy <= (y + nHeight - 1)))
			{
				PIXELCOLORRGB rgb = Interpolate(pbySrc,xx,yy,fu,fv,nScanWidth, nScanHeight);
			
				*pbyDst++ = rgb.blue;
				*pbyDst++ = rgb.green;
				*pbyDst++ = rgb.red;
		
				//alpha数据由外部填充.
				pbyDst++;	
			}
			else
				pbyDst += 4;
		}
	}
	return TRUE;

}

//x,y 基于目地图像坐标
//nWidth,nHeight为指定区域的宽度和高度

//返回给定区域的反向变换后的点,其坐标是区域图像而言的,
//区域图像自身也有一个坐标系统,其坐标原点在左上角点.
//最大坐标为nWidth - 1
//最大坐标为nHeight - 1

FLOATPOINT CImageGeneralTransform::GetInversePoint(int x,int y,int nWidth,int nHeight)
{
	FLOATPOINT fp;
	fp.x = 0.0f;
	fp.y = 0.0f;
	return fp;

}

⌨️ 快捷键说明

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