zoukankan      html  css  js  c++  java
  • iOS 图片裁剪方法

    更多图片处理方法见图片组件 BBWebImage

    iOS 图片裁剪方法

    通过 CGImage 或 CIImage 裁剪

    UIImage 有 cgImage 和 ciImage 属性,分别可以获得 CGImage 和 CIImage 对象。CGImage 和 CIImage 对象都有裁剪方法,传入 CGRect 的参数表示要裁剪的区域(采用 UIImage 的坐标)。

    static func cropImage(_ image: UIImage, withRect originalRect: CGRect) -> UIImage? {
        if originalRect.width <= 0 || originalRect.height <= 0 { return nil }
        var rect = originalRect
        if image.scale != 1 {
            rect.origin.x *= image.scale
            rect.origin.y *= image.scale
            rect.size.width *= image.scale
            rect.size.height *= image.scale
        }
        if let croppedCgImage = image.cgImage?.cropping(to: rect) {
            return UIImage(cgImage: croppedCgImage)
        } else if let ciImage = image.ciImage {
            let croppedCiImage = ciImage.cropped(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? {
        if rect.width <= 0 || rect.height <= 0 { return nil }
        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/p/6490037.html

  • 相关阅读:
    状压DP【p1879】[USACO06NOV]玉米田Corn Fields
    Tarjan缩点+Spfa最长路【p3627】[APIO2009] 抢掠计划
    Tarjan缩点【p1726】上白泽慧音
    分层图【p4822】[BJWC2012]冻结
    Tarjan缩点+LCA【p2783】有机化学之神偶尔会做作弊
    线段树【p1607】[USACO09FEB]庙会班车Fair Shuttle
    better-scroll踩坑合集
    在浏览器上安装 Vue Devtools工具
    无法执行vue初始化命令
    vue-cli创建第一个项目(用git bash解决上下键移动选择问题)
  • 原文地址:https://www.cnblogs.com/silence-cnblogs/p/6490037.html
Copyright © 2011-2022 走看看