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