Swift 图片转成单通道灰度

这里只是玩一玩, 追求效率的同学可以参考 Apple 的 Accelerate.vImage


extension UIImage {
    
    func graySacled() -> UIImage? {
        
        guard
            let cgImage = cgImage,
            let data = cgImage.dataProvider?.data as Data? else {
                return nil
        }
        
        let width = cgImage.width
        let height = cgImage.height
        let channels = 4
        let size = data.count / channels
        
        let buffer = UnsafeMutablePointer<CUnsignedChar>.allocate(capacity: size)
        defer { free(buffer) }

        stride(from: 0, to: data.count, by: channels).forEach {
            /// 这里灰色使用最简单的算法 `G = (R + G + B) / 3`
            buffer.advanced(by: $0 / channels).pointee = avarage(($0..<$0 + 3).map { data[$0].uint16 }).uint8
        }
        /// =================== buffer 已经是`单通道` `灰色`, 下面是合成图片 ===================
        
        let releaseData: CGDataProviderReleaseDataCallback = {
            (info, buffer, length) in
        }
        
        return CGDataProvider(
                dataInfo: nil,
                data: buffer,
                size: size,
                releaseData: releaseData)
            .flatMap {
                CGImage(
                width: width,
                height: height,
                bitsPerComponent: 8,
                bitsPerPixel: 8,
                bytesPerRow: width,
                space: CGColorSpaceCreateDeviceGray(),
                bitmapInfo: CGBitmapInfo(rawValue: 0),
                provider: $0,
                decode: nil,
                shouldInterpolate: true,
                intent: .defaultIntent)
            }
            .flatMap(UIImage.init)

    }
}

public func avarage<S: Collection>(
    _ sequence: S)
    -> S.Element where S.Element: FixedWidthInteger {
        return sequence.reduce(0, +) / S.Element(sequence.count)
}

extension UInt16 {
    var uint8: UInt8 {
        return UInt8(self)
    }
}

extension UInt8 {
    var uint16: UInt16 {
        return UInt16(self)
    }
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • LJ的ios开发阅读 5,754评论 1 2
  • 所谓颜色或灰度级指黑白显示器中显示像素点的亮暗差别,在彩色显示器中表现为颜色的不同,灰度级越多,图像层次越清楚逼真...
    FlyElephant阅读 6,846评论 0 0
  • 今年三月,认识了一位热情的宝妈,她给我介绍了一个很适合孩子家长都在国内的家庭英语启蒙公众号“囡囡爸亲子英语”,一了...
    AA东方瑜伽小达人阅读 4,396评论 1 2
  • 邹小邹大厨阅读 1,252评论 0 1
  • 最近这热乎乎的天气,我自己当然是更偏爱绿瓶子一些的。到办公室第一件事就是先拿绿屏喷喷胳膊腿儿的,缓解下在路上被晒疼...
    Amybubu阅读 33评论 0 0

友情链接更多精彩内容