将RGBA数组转换为UIImage时错误的结果

时间:2017-10-27 10:22:30

标签: ios swift graphics uiimage

我正在尝试从ARGB原始阵列创建一个UIImage。

首先,我创建一个640x480像素(307200)的数组,并将它们全部设置为红色。

var rgbArray = [Int?](repeating: nil, count: 307200)
for i in 0 ..< 307200 {
    rgbArray[i] = 0x00ff0000 // Red pixel
}

现在进行图片转换:

let data = UnsafeMutablePointer(mutating: rgbArray)

let releaseMaskImagePixelData: CGDataProviderReleaseDataCallback = { (info: UnsafeMutableRawPointer?, data: UnsafeRawPointer, size: Int) -> () in
    return
}

let provider: CGDataProvider! = CGDataProvider(dataInfo: nil, data: data, size: 307200, releaseData: releaseMaskImagePixelData)

let cgImage = CGImage(
    width: 640,
    height: 480,
    bitsPerComponent: 8,
    bitsPerPixel: 32,
    bytesPerRow: 2560,
    space: CGColorSpaceCreateDeviceRGB(),
    bitmapInfo: CGBitmapInfo(rawValue: CGImageAlphaInfo.noneSkipLast.rawValue),
    provider: provider,
    decode: nil,
    shouldInterpolate: true,
    intent: .defaultIntent
)

let uiImage = UIImage(cgImage: cgImage!)

结果是这样的图像:

enter image description here

请注意,图像是蓝色而不是红色,还有那些奇怪的垂直线。

我做错了什么?

1 个答案:

答案 0 :(得分:0)

我自己回答。

这是因为rgbArray(Int?)的类型,如果我不做它是可选的,它可以正常工作,例如:

var rgbArray = [Int](repeating: 0xffff0000, count: 307200)

我仍然无法理解这种奇怪的行为,但至少我让它发挥了作用。