Swift UIImage与RBGA array互转

535 阅读1分钟

因为需求问题,需要处理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的连续数组,代码上也有直接体现