【问题标题】:UIGraphicsImageRenderer: pngData for grayscale imageUIGraphicsImageRenderer:用于灰度图像的 pngData
【发布时间】:2018-01-27 12:45:06
【问题描述】:

我很喜欢使用自 iOS 10 以来引入的 UIGraphicsImageRenderer 的较新 API,但现在我想知道是否有可能从其 pngData 方法中获得灰度 Data

假设我有一个名为“mask.png”的输入图像,一个灰度图像。通过查看UIImage 的底层色彩空间,我已经验证它加载为灰度。较旧的 API UIImagePNGRepresentation 似乎能够检测颜色空间并正确编码其返回的 Data。但是,自 iOS 10 以来引入的 pngData 函数似乎将我的 Data 转换为 RGB 颜色空间。

extension UIImage {
    public func pngData_olderAPI() -> Data? {
        return UIImagePNGRepresentation(self)
    }

    public func pngData() -> Data {
        let renderedSize = CGSize(width: size.width, height: size.height)
        let renderer = UIGraphicsImageRenderer(size: renderedSize, format: UIGraphicsImageRendererFormat())
        return renderer.pngData { (rendererContext) in
            let rect = CGRect(x: 0, y: 0, width: renderedSize.width, height: renderedSize.height)
            self.draw(in: rect)
        }
    }
}

let mask = UIImage(named: "mask.png")
print(mask?.cgImage?.colorSpace.debugDescription)

let data = mask?.pngData_olderAPI()
let unwrappedMask = UIImage(data: data!)
print(unwrappedMask?.cgImage?.colorSpace.debugDescription)

let data2 = mask?.pngData()
let unwrappedMask2 = UIImage(data: data2!)
print(unwrappedMask2?.cgImage?.colorSpace.debugDescription)

这是(简化的)输出:

...kCGColorSpaceModelMonochrome; Dot Gain 20%))")
...kCGColorSpaceICCBased; kCGColorSpaceModelMonochrome; Dot Gain 20%))")
...kCGColorSpaceICCBased; kCGColorSpaceModelRGB; sRGB IEC61966-2.1))")

我不知道如何在较新的 API 中设置色彩空间。是否可以使用新 API 保存灰度图像?

【问题讨论】:

    标签: ios uiimage uikit core-graphics color-space


    【解决方案1】:

    从 iOS 12 开始,UIGraphicsImageRender 将根据执行的绘图自动选择正确的色彩空间。在我的例子中,它自动创建了具有灰度色彩空间的图像。

    <CGColorSpace 0x280d869a0> (kCGColorSpaceICCBased; kCGColorSpaceModelMonochrome; Generic Gray Gamma 2.2 Profile)
    

    这已在 WWDC 2018 的 iOS Memory Deep Dive 会议中进行了解释。

    无法使用此 API 手动指定色彩空间。然而,与此相关的是,您可以在UIGraphicsImageRendererFormat 上设置preferredRange,但没有选择单色的选项。

    【讨论】:

      猜你喜欢
      • 2016-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-02
      • 1970-01-01
      • 2018-11-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多