专栏首页joealzhouswift图片颜色占比分析

swift图片颜色占比分析

swift图片颜色占比分析

extension UIImage {
    func scaleTo(size: CGSize) -> UIImage? {
        UIGraphicsBeginImageContextWithOptions(size, false, 1.0)
        self.draw(in: CGRect(x: 0, y: 0, width: size.width, height: size.height))
        let newImg = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return newImg
    }
    
    /// 一张图颜色占比 取十种颜色
    func colorRate() -> [Double] {
        // 把 UIImage 转换成 CGImage Data
        let provider = self.cgImage?.dataProvider
        let pixeData = provider?.data
        guard let pxData = pixeData else {
            return []
        }
        guard let data = CFDataGetBytePtr(pxData) else {
            return []
        }
        let dataLength = CFDataGetLength(pxData)
        let numberOfColorComponents = 4 // R,G,B, and A
        
        // 用来装 color ,key 为 R-G-B 字符串,value 为出现次数
        var colors = [String: Double]()
        var colorCount: Double = 0
        var i = 0
        while i < dataLength {
            i += numberOfColorComponents
            if data[i + 3] != 0 {//非透明
                colorCount += 1
                let red = data[i]
                let green = data[i + 1]
                let blue = data[i + 2]
                let result = "\(red)-\(green)-\(blue)"
                if !colors.keys.contains(result) {
                    colors[result] = 1
                } else {
                    colors[result] = colors[result]! + 1.0
                }
            }
        }
        
        let  colorValues = colors.values.sorted { $0 > $1 }
        var colorRates = [Double]()
        for (index, item) in colorValues.enumerated() {
            if index < 10 {
                let rate = item / colorCount
                colorRates.append(rate)
            }
        }
        return colorRates
    }
}

调用以上方法,终端输出: [0.3862848497311907, 0.093752754193718965, 0.088868650665413204, 0.088369223537706751, 0.018655072123152854, 0.017913275948177092, 0.011376656188489674, 0.0076897088633626131, 0.0057727900349598986, 0.0051558506419107494]

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • iOS共用体

    使代码存储数据高效率的同时,有较强的可读性,可以使用共用体来增强代码可读性,同时使用位运算来提高数据存取的效率。

    用户6094182
  • iOS runtime--获取类信息

    在iOS中可以通过runtime获取一个类的相关信息:有哪些方法、有哪些协议、有哪些属性、有哪些成员变量。安排的明明白白,老铁O(∩_∩)O哈哈~

    用户6094182
  • swift中使用runtime修改属性值

    在OC中继承自NSObject的类都遵循runtime, 那么纯粹的Swift类呢? 如果在swift中想使用runtime修改属性值,在属性和方法之前加上@...

    用户6094182
  • js的join split startsWith endsWith

    用户7873631
  • swift基础1

    用户2554571
  • ES2018

    但如果数据源是异步的,for...of循环就只能拿到一堆Promise,而不是想要的值:

    ayqy贾杰
  • Swift基础---Integers

    用户3004328
  • 重温基础:ES9系列

    所有整理的文章都收录到我《Cute-JavaScript》系列文章中,访问地址:http://js.pingan8787.com

    用户1462769
  • 嘿,这些ES9的骚操作你还不知道吗?

    所有整理的文章都收录到我《Cute-JavaScript》系列文章中,访问地址:http://js.pingan8787.com

    ConardLi
  • 变量的解构赋值

    上面代码中,函数move的参数是一个对象,通过对这个对象进行解构,得到变量x和y的值。如果解构失败,x和y等于默认值。

    达达前端

扫码关注云+社区

领取腾讯云代金券