65.9K
CodeProject 正在变化。 阅读更多。
Home

自由图像变换

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.94/5 (37投票s)

2009年5月2日

CPOL
viewsIcon

140666

downloadIcon

6962

介绍一种使用 C# 自由变换图像的方法

picture.JPG

引言

我编写了一个小巧但功能强大的 C# 应用程序,可以缩放、旋转、倾斜和扭曲图像。该程序包含一个用户控件 Canvas 和一个类 FreeTransformCanvas 可以始终将图片保持在窗口中心,并允许用户通过鼠标滚轮缩放图像。您可以使用鼠标左键选取图片的角,并在 Canvas 中自由移动它。图像变换由类 FreeTransform 完成。当您设置其 BitmapFourCorners 时,您可以获得变换后的 Bitmap。如果您喜欢高质量的图像,可以将 IsBilinearInterpolation 设置为 true。它是如何工作的?下图演示了该方法的核心

点 P 到图像边界的最近距离是 w1w2h1 h2。假设点 P 在原始图像上的位置是

([w1/(w1+w2)]*imageWidth, [h1/(h1+h2)]*imageHeight) 

然后,原始图像上的颜色...

([w1/(w1+w2)]*imageWidth, [h1/(h1+h2)]*imageHeight) 

...被放置在点 P 上,从而得到结果。
为了计算距离,使用了向量叉积

dab = Math.Abs((new YLScsDrawing.Geometry.Vector(vertex[0], srcPt)).CrossProduct(AB));
dbc = Math.Abs((new YLScsDrawing.Geometry.Vector(vertex[1], srcPt)).CrossProduct(BC));
dcd = Math.Abs((new YLScsDrawing.Geometry.Vector(vertex[2], srcPt)).CrossProduct(CD));
dda = Math.Abs((new YLScsDrawing.Geometry.Vector(vertex[3], srcPt)).CrossProduct(DA));

ptInPlane.X = (float)(srcW * (dda / (dda + dbc)));ptInPlane.Y = 
					(float)(srcH*(dab/(dab+dcd)));

感谢您的尝试!

历史

  • 2009 年 5 月 2 日:初始发布
  • 2009 年 5 月 8 日:添加了 ConfigSave 函数
© . All rights reserved.