【问题标题】:Swift convert UIImage to 24-bit RGB with no alpha channelSwift 将 UIImage 转换为没有 alpha 通道的 24 位 RGB
【发布时间】:2018-02-12 19:01:42
【问题描述】:

我想将 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
}

【问题讨论】:

    标签: ios uiimage swift4 24-bit


    【解决方案1】:

    这有点老了,但因为我也很努力,所以我认为添加一些我发现的东西会很好。

    正如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
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-01
      • 1970-01-01
      • 2016-06-11
      • 1970-01-01
      • 2011-12-04
      • 2012-07-17
      • 1970-01-01
      • 2019-09-05
      相关资源
      最近更新 更多