我提供了一个 UIKit 测试应用程序的 link,该应用程序并排显示三个不同的图像,每个图像都位于单独的 MTKView 内。每个图像都标有不同的颜色配置文件:
我为所有颜色空间和格式设置了默认值。然后,我检查图像是否已标记,如果是,我会使用标记颜色空间中的状态覆盖这些值。
我设置的变量:
“colorSpace”默认值 = CGColorSpaceCreateDeviceRGB()
我还使用 MTKView.colorPixelFormat 在 CIRenderDestination 中设置“pixelFormat”。
如果图像已标记,我将使用标记的 colorSpace 覆盖以下值:
如果标记的 colorSpace.isWideGamutRGB = true,则我将 CIRenderDestination.colorSpace 设置为 ExtendedSRGB,忽略标记的广色域颜色空间中的颜色空间,并设置 colorPixelFormat = bgr10_xr
结果:
问题:我是否已正确连接所有内容?如果是,为什么一张图像失败,而另一张图像成功?
示例项目链接:
我想我已经解决了。对于非宽色域的标记图像,我在 MTKView 的底层 MetalLayer 上设置色彩空间(iOS/Catalyst 不允许您直接在 MTKView 上设置此设置):
在 MTKImageView.swift 中,替换:
if isWideGamutRGB {
self.colorPixelFormat = MTLPixelFormat.bgr10_xr
}
与:
if isWideGamutRGB {
self.colorPixelFormat = MTLPixelFormat.bgr10_xr
} else {
if let metalLayer = self.layer as? CAMetalLayer {
if let colorSpace = image.colorSpace {
metalLayer.colorspace = colorSpace
}
}
}
所有三个图像现在都能正确显示。