像 camscanner 一样裁剪 UIImage

Posted

技术标签:

【中文标题】像 camscanner 一样裁剪 UIImage【英文标题】:Cropping UIImage like camscanner 【发布时间】:2012-05-07 05:42:04 【问题描述】:

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

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

如果可能,请给我一些建议。

【问题讨论】:

嗨,您能告诉我您是如何实现上述内容的吗?如果可能的话,您能否分享任何教程或有用的链接? 嗨,开发者,你有解决这个问题的方法吗?拜托,你能添加这个功能的代码吗?我需要完全一样的。 【参考方案1】:

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

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

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

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

你可以使用OpenGL。

你可以使用OpenCV。 ..还有更多的方法来实现它。

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

    cvPerspectiveTransform

    cvWarpPerspective

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

一旦你得到转换矩阵,你需要将它传递给第二个函数。你可以访问这个thread

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

带有 opencv 库的 ios 应用程序可在 eosgarden 获得。

【讨论】:

嘿,你怎么能得到这些正方形的CGPoint,这样我们就可以绘制uiview点进行裁剪【参考方案2】:

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

这很简单,假设您知道如何形成进行拉伸的变换矩阵。我从来没有学过如何构建拉伸或倾斜图像的变换矩阵,所以我帮不上什么忙。我建议使用谷歌搜索转换矩阵和拉伸/倾斜。

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

【讨论】:

【参考方案3】:

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

不要使用 CGRect 和 CGContextClipToRect 尝试使用 CGContextEOClip OR CGContextClosePath

虽然我没有尝试过这个...但我尝试在 TouchesBegan 和 TouchesMoved 和 TouchesEnd 事件上使用 CGContextClosePath 绘制闭合路径。

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

【讨论】:

以上是关于像 camscanner 一样裁剪 UIImage的主要内容,如果未能解决你的问题,请参考以下文章

裁剪 UIImage 使其在保存时逆时针旋转 90º

通过自定义形状裁剪 UIImage

如何快速裁剪图​​像

UIScrollView 中图像上的cropImage 方法的问题会产生错误的图像

使用 UIView 框架裁剪 UIImage

如何像imageview一样裁剪位图中心? [复制]