我有一些调整图像大小的代码,所以我可以获得图像中心的缩放块 - 我使用它来获取 UIImage
并返回图像的小方形表示,类似于在专辑视图中看到的照片应用程序 . (我知道我可以使用 UIImageView
并调整裁剪模式以获得相同的结果,但这些图像有时会显示在 UIWebViews
中) .
我已经开始注意到这段代码中的一些崩溃,我有点难过 . 我有两种不同的理论,我想知道是否有基础 .
理论1)我通过绘制到目标大小的屏幕外图像上下文来实现裁剪 . 既然我想要图像的中心部分,我将传递给 drawInRect
的 CGRect
参数设置为's larger than the bounds of my image context. I was hoping this was Kosher, but am I instead attempting to draw over other memory that I shouldn'触及的东西?
理论2)我在后台线程中做了所有这些 . 我知道UIKit的部分内容仅限于主线程 . 我假设/希望绘制到屏幕外的视图不是其中之一 . 我错了吗?
(哦,我多么怀念 NSImage's drawInRect:fromRect:operation:fraction:
方法 . )
23 回答
我对其他解决方案不满意,因为他们要么抽取几次(使用超过必要的功率),要么有方向性问题 . 这是我用于UIImage *图像的缩放方形裁剪图像 .
更新2014-05-28:我写这篇文章的时候iOS 3左右是热门的新东西,我确信现在还有更好的方法可以做到这一点,可能是内置的 . 正如许多人所提到的,这种方法不考虑轮换;阅读一些额外的答案,并传播一些upvote爱,以保持对这个问题的回答对每个人都有帮助 .
原始回复:
我打算将我的回复复制/粘贴到其他地方的同一问题:
没有一个简单的类方法可以做到这一点,但有一个函数可以用来获得所需的结果:
CGImageCreateWithImageInRect(CGImageRef, CGRect)
将帮助你 .这是一个使用它的简短示例:
要在保持相同比例和方向的同时裁剪视网膜图像,请在UIImage类别(iOS 4.0及更高版本)中使用以下方法:
您可以制作UIImage类别并在任何需要的地方使用它 . 根据HitScans的回应和评论吼叫它 .
你可以这样使用它:
Swift 3版
借助这个桥接功能
CGRectMake
- >CGRect
(this answer回复@rob mayoff
):用法是:
输出:
这是我的UIImage裁剪实现,它遵循imageOrientation属性 . 所有方向都经过了彻底的测试 .
抬头:所有这些答案都假设一个
CGImage
-背面的图像对象 .image.CGImage
可以返回nil,如果UIImage
由CIImage
支持,如果您使用CIFilter
创建此图像,则会出现这种情况 .在这种情况下,您可能必须在新的上下文中绘制图像,并返回该图像(慢) .
这里没有任何答案100%正确处理所有比例和旋转问题 . 这是迄今为止所有内容的综合,是iOS7 / 8的最新版本 . 它意味着作为UIImage类别中的方法包含在内 .
我见过的大多数响应只处理(0,0)(x,y)的位置 . 好吧,这是一个案例,但我希望我的裁剪操作集中 . 我花了一段时间才弄明白的是WTF评论之后的界限 .
让我们以纵向拍摄的图像为例:
原始图像高度高于其宽度(哇,到目前为止还不奇怪!)
CGImageCreateWithImageInRect方法在其自己的世界中想象的图像不是真正的肖像,而是景观(这也是为什么如果你不在imageWithCGImage构造函数中使用orientation参数,它将显示为180旋转) .
所以,你应该想象它是一个风景,(0,0)位置是图像的右上角 .
希望它有意义!如果没有,请尝试使用不同的值,在选择cropRect的正确x,y,宽度和高度时,您会看到逻辑被反转 .
快速扩展
swift3
我使用下面的方法 .
}
Swift版的
awolf
的答案,对我有用:在 Swift 中裁剪UIImage的最佳解决方案,在精度,像素缩放方面......:
用于调用此函数的指令:
注意:the initial source code inspiration written in Objective-C has been found on "Cocoanetics" blog.
看起来有点奇怪,但效果很好,并考虑到图像方向:
在iOS9.2SDK上,我使用下面的方法将帧从UIView转换为UIImage
Swift 2.0 Update (CIImage compatibility)
扩展Maxim's Answer,但如果您的图像基于
CIImage
,则有效 .这是基于Noodles答案的更新的Swift 3版本
看https://github.com/vvbogdan/BVCropPhoto
关注@Arne的回答 . 我只是修复类别功能 . 把它放在UIImage的类别中 .
下面的代码段可能有所帮助 .