使用 UIGraphicsBeginImageContext 创建新图像会扭曲图像颜色

问题描述 投票:0回答:1

我试图将 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)

在此示例中,结果图像存在颜色失真。

库存模拟器图像的颜色失真情况示例:

关于如何解决这个问题有什么建议吗?

谢谢!

ios swift image cgimage ciimage
1个回答
0
投票

不幸的是,有几个因素可能会产生这种转变(例如,色彩空间、渲染意图等)。这一切都非常复杂。

我建议淘汰已弃用的

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)
}
© www.soinside.com 2019 - 2024. All rights reserved.