自从iOS 10以来,我一直喜欢使用UIGraphicsImageRenderer
中更新的API,但现在我想知道是否有可能从Data
方法中获得灰度pngData
。
假设我有一个名为“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 12开始,UIGraphicsImageRender
将根据执行的绘图自动选择正确的色彩空间。就我而言,它会自动创建具有灰度颜色空间的图像。
<CGColorSpace 0x280d869a0> (kCGColorSpaceICCBased; kCGColorSpaceModelMonochrome; Generic Gray Gamma 2.2 Profile)
在WWDC 2018的iOS Memory Deep Dive session 中对此进行了解释。
无法使用此API手动指定颜色空间。但是与此相关的是,您可以在
preferredRange
上设置UIGraphicsImageRendererFormat
,但是没有选择偏爱单色的选项。关于ios - UIGraphicsImageRenderer:灰度图像的pngData,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48475937/