像camscanner一样裁剪UIImage

时间:2012-05-07 05:42:05

标签: iphone objective-c uiimage core-animation crop

我陷入了我的应用功能。我想要裁剪功能类似于Cam Scanner Cropping。 CAM-SCANNER的屏幕是:  我创建了类似的裁剪视图。

enter image description here

enter image description here

我已经获得了四角的CGPoint。 但是我怎样才能获得倾斜的裁剪图像。

如果可能,请提供一些建议。

3 个答案:

答案 0 :(得分:5)

这是透视变换问题。在这种情况下,他们正在2D平面上绘制3D投影。

因为,第一个图像具有四边形的选择角,当您将其转换为矩形时,您需要添加更多像素信息(interpolation)或删除一些像素。

所以现在实际的问题是为裁剪的图像添加额外的像素信息并将其投影以生成第二个图像。它可以通过多种方式实现:

<>您可以通过应用带插值的透视变换矩阵来实现它。

<>你可以使用OpenGL

<>你可以使用OpenCV。 ..还有很多方法可以实现它。

我使用OpenCV解决了这个问题。 OpenCV中的以下功能将帮助您实现这一目标。

  1. cvPerspectiveTransform

  2. cvWarpPerspective

  3. 第一个函数将使用源和目标投影坐标计算变换矩阵。在你的情况下,src数组将包含来自CGPoint的所有角落的值。并且dest将具有矩形投影点,例如{(0,0)(200,0)(200,150)(0,150)}。

    获得转换矩阵后,您需要将其传递给第二个函数。您可以访问此thread

    OpenCV库可能没有其他替代方案,但它有很好的图像处理算法集合。

    使用opencv库的iOS应用程序可在eosgarden获得。

答案 1 :(得分:3)

我看到了两种可能性。第一种是计算倾斜图像的转换矩阵,并将其安装在视图图层的CATransform3D属性中。

这很简单,假设您知道如何形成进行拉伸的变换矩阵。我从来没有学过如何构建拉伸或歪斜图像的转换矩阵,所以我无法提供任何帮助。我建议使用谷歌转换矩阵和拉伸/倾斜。

另一种方法是将您正在裁剪的图像部分转换为OpenGL纹理,并将纹理映射到输出。实际的纹理绘制部分很容易,但是有大约1000公斤的OpenGL设置要做,而且要学习很多东西以便完成任何事情。如果你想追求这条路线,我建议使用新的iOS 5 GLKit搜索简单的2D纹理示例。

答案 2 :(得分:0)

使用链接中提供的代码:http://www.hive05.com/2008/11/crop-an-image-using-the-iphone-sdk/

而不是使用CGRect和CGContextClipToRect尝试使用CGContextEOClip或CGContextClosePath

虽然我已经尝试了这个...但我尝试使用TouchesBegan和TouchesMoved以及TouchesEnd事件上的CGContextClosePath绘制封闭路径。

希望这可以让您更好地了解您的问题...