拉伸图像以适合任何四边形

时间:2011-08-22 15:27:23

标签: image-processing canvas image-manipulation stretch html5-canvas

应用程序PhotoFiltre可以选择拉伸部分图像。您选择一个矩形形状,然后您可以抓住并移动其他地方的顶点以制作任何四边形。您选择的图像部分将随之拉伸。希望这些图像让我的观点更加清晰:

before

after

是否有可以处理此问题的通用算法?我想在HTML5画布上获得相同的效果 - 给定一个图像和产生的角点,我希望能够以一种整齐地填充新四边形的方式绘制拉伸图像。

前一段时间我问过something similar,解决办法是将图像分成三角形并拉伸每个三角形,使每三个点对应原始图像上的三个点。这种技术相当广泛,我想如果有更通用的方法来实现这一点。

我想在3D渲染器中使用它,但我想使用(2D)四边形。

我不知道PhotoFiltre内部是否也使用三角形,或者它是否使用另一种(更便宜的)算法来拉伸这样的图像。

是否有人知道是否有更便宜或更通用的方法/算法来拉伸矩形图像,以便在给定四个点时填充四边形?

2 个答案:

答案 0 :(得分:3)

常规方法是从目的地开始,选择合适的网格大小,然后为新形状中的每个点计算源图像中的对应点(可能根据您需要的质量进行插值)

答案 1 :(得分:0)

仿射变换。

给定“拉伸”图形的四个点和它应该匹配的图形的四个点(例如矩形),仿射变换提供您需要的空间映射。对于原始图像中的每个点(x1,y1),在第二个“拉伸”图像中存在对应点(x2,y2)。

对于拉伸图像中的每个整数值像素(x2,y2),使用仿射变换在原始图像中找到对应的实值点(x1,y1)并将其颜色应用于(x2,y2)

http://demonstrations.wolfram.com/AffineTransform/

您可以在线找到Java和其他语言的示例代码。 .NET有Matrix类。