Swift将UIImage转换为24位RGB,没有alpha通道

时间:2018-02-12 19:01:43

标签: ios uiimage swift4 24-bit

我想将UIImage转换为24位RGB,而不使用32位RGBA缓冲区。

我试过这个,但它不起作用(字节全为零):

public func pixelsRGB() -> [UInt8]? {

    let size = self.size
    let dataSize = size.width * size.height * 3
    var pixelData = [UInt8](repeating: 0, count: Int(dataSize))
    let colorSpace = CGColorSpaceCreateDeviceRGB()
    let context = CGContext(data: &pixelData,
                            width: Int(size.width),
                            height: Int(size.height),
                            bitsPerComponent: 8,
                            bytesPerRow: 3 * Int(size.width),
                            space: colorSpace,
                            bitmapInfo: CGImageAlphaInfo.noneSkipLast.rawValue)
    guard let cgImage = self.cgImage else {
        return nil
    }
    context?.draw(cgImage, in: CGRect(x: 0, y: 0, width: size.width, height: size.height))

    return pixelData
}

1 个答案:

答案 0 :(得分:0)

这有点老了,但是由于我也为此感到挣扎,所以我认为最好添加一些我发现的东西。

根据this SO post的回答,Quartz不支持24位RGB图像。请参阅受支持的格式here。 @matt也here

回答了这个问题

我怀疑它无法创建CGContext并为 context 返回nil。然后,它从不写入上下文,而仅返回为字节缓冲区初始化的值。

如果您更改线路:

bytesPerRow: 3 * Int(size.width),

收件人:

bytesPerRow: 4 * Int(size.width), //to accommodate the non-existing alpha channel

您将获得一个有效的上下文,并能够使用它来画画。有点痛苦,但这就是我的解决方法。