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