我想将 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
}
Best Answer-推荐答案 strong>
这有点老了,但因为我也很挣扎,所以我认为添加一些我发现的东西会很好。
正如 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
您将获得一个有效的上下文并能够使用它来绘制。有点痛苦,但这就是我解决它的方法。
关于ios - Swift 将 UIImage 转换为没有 alpha channel 的 24 位 RGB,我们在Stack Overflow上找到一个类似的问题:
https://stackoverflow.com/questions/48753643/
|