swift UIImage与RBGA array互转

因为需求问题,需要处理rbga array然后转回去,但是不太熟悉IOS这里的CG处理,查了半天资料和示例都是OC和RBG略去透明通道的,于是自己用swift实现了一下,直接看代码吧

//
//  UIImageRGBAArray.swift
//
//  Created by Perol Notsf on 2022/6/4.
//
func rgbaArray2UIImage(data:[UInt8], width:Int, height:Int) -> UIImage? {
    var data = data
    guard let provider = CGDataProvider(data: NSData(bytes: &data, length: data.count)) else { return nil }
    guard let cgimage = CGImage(width: width, height: height, bitsPerComponent: 8, bitsPerPixel: 32, bytesPerRow: width * 4, space: CGColorSpaceCreateDeviceRGB(), bitmapInfo: CGBitmapInfo(rawValue: CGImageAlphaInfo.premultipliedLast.rawValue), provider: provider, decode: nil, shouldInterpolate: true, intent: CGColorRenderingIntent.defaultIntent) else { return nil }
    return UIImage(cgImage: cgimage)
}

func uiImage2RGBAArray(uiImage:UIImage)->[UInt8]? {
    guard let cgImage = uiImage.cgImage else { return nil }
    guard let cfData = cgImage.dataProvider?.data else { return nil }
    guard let buf = CFDataGetBytePtr(cfData) else { return nil }
    var result : [UInt8] = []
    let bytesPerPixel = cgImage.bitsPerPixel / cgImage.bitsPerComponent
    for y in 0 ..< cgImage.height {
        for x in 0 ..< cgImage.width {
            let offset = (y * cgImage.bytesPerRow) + (x * bytesPerPixel)
            result.append(buf[offset])
            result.append(buf[offset + 1])
            result.append(buf[offset + 2])
            result.append(buf[offset + 3])
        }
    }
    return result
}

注意:这里的rgba array,是指rgba分别占用一个UInt8,也就是一个pixel信息长度为4乘以8的连续数组,代码上也有直接体现

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值