通过 CGImage 或 CIImage 裁剪
UIImage
有cgImage
和ciImage
属性,分别可以获得CGImage
和CIImage
对象。CGImage
和CIImage
对象都有cropping(to:)
方法,传入CGRect
的参数表示要裁剪的区域(采用UIImage
的坐标)。
1
2
3
4
5
6
7
8
9
10
|
static func cropImage(_ image: UIImage, withRect rect: CGRect) -> UIImage? {
if let cgImage = image.cgImage,
let croppedCgImage = cgImage.cropping(to: rect) {
return UIImage(cgImage: croppedCgImage)
} else if let ciImage = image.ciImage {
let croppedCiImage = ciImage.cropping(to: rect)
return UIImage(ciImage: croppedCiImage)
}
return nil
}
|
对CGImage
来说,传入的CGRect
参数如果完全不在原图区域内,cropping(to:)
方法返回空;如果有部分在原图区域内,cropping(to:)
方法返回在原图区域部分的CGImage
。
通过位图(Bitmap)裁剪
通过位图重新绘制图片,也可以获得裁剪之后的图片。
1
2
3
4
5
6
7
8
9
|
static func cropImage(_ image: UIImage, withRect rect: CGRect) -> UIImage? {
UIGraphicsBeginImageContext(rect.size)
guard let context = UIGraphicsGetCurrentContext() else { return nil }
context.translateBy(x: -rect.minX, y: -rect.minY)
image.draw(at: .zero)
let croppedImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return croppedImage
}
|
位图大小为需要裁剪区域CGRect
的大小size
。用原图绘制,为了使裁剪区域正好在位图区域,需要进行坐标位移context.translateBy(x: -rect.minX, y: -rect.minY)
。
如果传入的CGRect
参数有部分或全部不在原图区域内,则超出原图区域的部分也会被绘制(绘制为透明),这与CGImage
的裁剪方法不同。
简单试了几次,发现通过 CGImage 裁剪的 CPU 占用率比通过位图裁剪要低。仅从性能角度考虑,推荐使用前者。如果希望裁剪出来的图片不超出原图区域,也推荐使用前者。如果需要绘制其他的内容(比如其他形状、颜色,或绘制的内容超出原图区域),则要使用后者。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:http://www.cnblogs.com/silence-cnblogs/archive/2017/03/02/6490037.html