Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/107.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios UIGraphicsImageRenderer:灰度图像的pngData_Ios_Uiimage_Uikit_Core Graphics_Color Space - Fatal编程技术网

Ios UIGraphicsImageRenderer:灰度图像的pngData

Ios UIGraphicsImageRenderer:灰度图像的pngData,ios,uiimage,uikit,core-graphics,color-space,Ios,Uiimage,Uikit,Core Graphics,Color Space,我喜欢使用iOS 10推出的UIGraphicsImageRenderer中更新的API,但现在我想知道是否有可能从它的pngData方法中获取灰度数据 假设我有一个名为“mask.png”的输入图像,一个灰度图像。我通过查看UIImage的底层颜色空间,验证了它是以灰度级加载的。较旧的APIUIImagePNGRepresentation似乎能够检测颜色空间并正确编码其返回的数据。然而,iOS 10之后引入的pngData函数似乎将我的数据转换为RGB颜色空间 extension UIImag

我喜欢使用iOS 10推出的
UIGraphicsImageRenderer
中更新的API,但现在我想知道是否有可能从它的
pngData
方法中获取灰度
数据

假设我有一个名为“mask.png”的输入图像,一个灰度图像。我通过查看
UIImage
的底层颜色空间,验证了它是以灰度级加载的。较旧的API
UIImagePNGRepresentation
似乎能够检测颜色空间并正确编码其返回的
数据。然而,iOS 10之后引入的
pngData
函数似乎将我的
数据
转换为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)
以下是(简化的)输出:


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

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

<CGColorSpace 0x280d869a0> (kCGColorSpaceICCBased; kCGColorSpaceModelMonochrome; Generic Gray Gamma 2.2 Profile)
(KCGColorSpaceICCBase;KCGColorSpaceModel单色;通用灰度伽马2.2剖面)
这一点在2018年WWDC会议上进行了解释

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

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