ios - Swift 将 UIImage 转换为没有 alpha channel 的 24 位 RGB

标签 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
}

最佳答案

这有点旧,但由于我也在努力解决它,所以我认为添加一些我发现的东西会很好。

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/

相关文章:

ios - 在swift中将参数数组作为请求主体传递

IOS:屏蔽图像以考虑视网膜比例因子

ios - 是否可以执行溶解动画但控制进度,例如如何使用 Alpha?

ios - 我有带导航的 1x、2x、3x 图像的图标

ios - 应用商店 : pre-grab an iOS app name for an application which is still in development

ios - 使用 MKMapView、核心位置和核心数据

ios - 从服务器获取 JSON 数据后,UICollectionViewCell 不可点击

ios - 如何按数据大小缩小 IOS 中的 UIImage

ios - NavigationBar 为一个 View 设置 TitleColor