iOS 图片裁剪的实现方法
程序员文章站
2024-02-12 19:24:58
ios 图片裁剪方法,主要有两种,一起来看下。
通过 cgimage 或 ciimage 裁剪
uiimage有cgimage和ciimage属性,分别可以获得cgim...
ios 图片裁剪方法,主要有两种,一起来看下。
通过 cgimage 或 ciimage 裁剪
uiimage
有cgimage
和ciimage
属性,分别可以获得cgimage
和ciimage
对象。cgimage
和ciimage
对象都有cropping(to:)
方法,传入cgrect
的参数表示要裁剪的区域(采用uiimage
的坐标)。
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)裁剪
通过位图重新绘制图片,也可以获得裁剪之后的图片。
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 占用率比通过位图裁剪要低。仅从性能角度考虑,推荐使用前者。如果希望裁剪出来的图片不超出原图区域,也推荐使用前者。如果需要绘制其他的内容(比如其他形状、颜色,或绘制的内容超出原图区域),则要使用后者。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。