我试图将2张图像绘制到同一个画布中,对于某些图像,我在生成的UI Image中看到轻微的 colored颜色 失真,图像"变亮"了一点,我无法弄清楚原因.

这是我使用的一个简化代码,即使绘制单个图像,它也会产生 colored颜色 失真:

// originalImageURI is a local path
guard let originalImage = normalizedImageOrientation(image: originalImageURI) else { ... }

UIGraphicsBeginImageContext(originalImage.size)
originalImage.draw(at: .zero)
let combinedImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()

在这个例子中,combinedImage具有 colored颜色 失真.

我try 使用https://github.com/MetalPetal/MetalPetal,但做了同样的事情:导入和渲染原始图像也会产生 colored颜色 失真:

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)

在这个例子中,结果图像具有 colored颜色 失真.

股票模拟器图像的 colored颜色 失真外观示例:

color distortion sample

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

谢谢!

推荐答案

不幸的是,有几个因素可以产生这种转变(例如, colored颜色 空间、渲染意图、像素插值(如果调整大小)等).一切都很复杂.

我建议退役已废弃的UIGraphicsBeginImageContext,转而使用当代的UIGraphicsImageRenderer.我建议在实例化时指定format,并向其提供原始图像的imageRendererFormat,以最大限度地减少这些问题.例如:

let rect = CGRect(origin: .zero, size: size)
let newImage = UIGraphicsImageRenderer(bounds: rect, format: originalImage.imageRendererFormat).image { _ in
    originalImage.draw(in: rect)
}

在此屏幕快照中,顶部图像是原始图像,底部图像是由UIGraphicsImageRenderer和公共format生成的图像,我比较了两张图像上的相同像素,它们似乎没有遭受任何 colored颜色 漂移:

enter image description here

Ios相关问答推荐

在将Cocoapods更新到1.13.0之后,它抛出错误

Xcode 15阻止我的应用程序运行:由于实时模式录制的高比率,丢失了1条日志(log)/路标消息?

clang:错误:SDK 路径中不包含libarclite

清除/删除 NavigationController 中的多个 ViewController

如何创建装饰视图?

当目标位于菜单标签内时,matchedGeometryEffect 的行为很奇怪

Flutter iOS 构建失败:DVTCoreDeviceEnabledState_Disabled

实现 ListView Builder Widget Flutter 后退按钮不起作用

如何使用 pushViewController 从 UIHostingController 的 SwiftUI 视图中推送 ViewController?

SwiftUI 图表 BarMark 将注释对齐到图表顶部

CoreML 不能并发(多线程)工作?

叠加视图不在堆栈中维护自身 - SwiftUI

SwiftUI:通过Sheet将数据添加到Realm DB时视图不更新

SwiftUI 文本字段代理绑定代码忽略空格不起作用?

警告:iPad:Icon-72.png:图标尺寸(0 x 0)

如何在 iOS 中判断暗模式?

try 在 iOS 中处理后退导航按钮操作

什么是伞头?

Xcode 10.2 无法在 iOS < 10 的模拟器上运行应用程序

在自动布局中居中子视图的 X 会引发未准备好约束