我试图将 2 个图像绘制到同一个画布中,对于某些图像,我在生成的 UIImage 中看到轻微的颜色失真,图像“变亮”了一点,我无法弄清楚原因。
这是我使用的简化代码,即使绘制单个图像也会产生颜色失真:
// originalImageURI is a local path
guard let originalImage = normalizedImageOrientation(image: originalImageURI) else { ... }
UIGraphicsBeginImageContext(originalImage.size)
originalImage.draw(at: .zero)
let combinedImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
在这个例子中,
combinedImage
有颜色失真。
我尝试使用 https://github.com/MetalPetal/MetalPetal 但做同样的事情:导入并渲染原始图像也会产生颜色失真:
let mtiImage = MTIImage(cgImage: originalImage.cgImage!)
let options = MTIContextOptions()
guard let device = MTLCreateSystemDefaultDevice(), let context = try? MTIContext(device: device, options: options) else { ... }
let combinedImage = try context.makeCGImage(from: mtiImage)
let resultImage = UIImage(cgImage: combinedImage)
在此示例中,结果图像存在颜色失真。
库存模拟器图像的颜色失真情况示例:
关于如何解决这个问题有什么建议吗?
谢谢!
不幸的是,有几个因素可能会产生这种转变(例如,色彩空间、渲染意图等)。这一切都非常复杂。
我建议淘汰已弃用的
UIGraphicsBeginImageContext
并使用当代的 UIGraphicsImageRenderer
。我建议将 format
指定为其 image
方法,为其提供原始图像的 imageRendererFormat
,以最大限度地减少这些问题。例如:
let rect = CGRect(origin: .zero, size: size)
let newImage = UIGraphicsImageRenderer(size: size, format: originalImage.imageRendererFormat).image { _ in
originalImage.draw(in: rect)
}