我正在尝试将 CIImage 输出到磁盘,并且正在寻找最有效的方法。我发现了这个问题,它建议使用 CIContext 的writeJPEGRepresentation
/writePNGRepresentation
方法。但是,每当我尝试使用这些方法时,它们都会产生空白图像。
对于 JPEG,它会生成纯黑色图像。PNG 生成纯透明图像。HEIF 方法也产生了纯黑色图像。如果我使用生成 a 的jpegRepresentation
orpngRepresentation
方法而Data
不是直接写入磁盘,则结果相同。
如果我改为使用 渲染这些对象createCGImage
,然后从 CGImage 中写出数据,它们看起来很好。
任何想法为什么会发生这种情况?
这是一个说明问题的简单示例:
let ciImage = CIImage(contentsOf: photoURL, options: [CIImageOption.applyOrientationProperty: true])!
let context = CIContext()
try! context.writeJPEGRepresentation(of: ciImage, to: FileManager.default.temporaryDirectory.appendingPathComponent("testFromCIImage.jpeg"), colorSpace: CGColorSpace(name: CGColorSpace.sRGB)!, options: [:])
let cgImage: CGImage = context.createCGImage(ciImage, from: ciImage.extent)!
let uiImage = UIImage(cgImage: cgImage)
try! uiImage.jpegData(compressionQuality: 1.0)!.write(to: FileManager.default.temporaryDirectory.appendingPathComponent("testFromUIImage.jpeg"))
testFromCIImage.jpeg
显示为空白图像,与原始输入图像大小相同。testFromUIImage.jpeg
看起来与输入图像相同。
我创建了一个示例项目来说明该问题,以及一些示例图像。
更新
我只发现图像输出正确的一种情况 - 当源图像是 PNG,并且colorSpace
参数writeJPEGRepresentation
与源图像的颜色空间匹配时。即使色彩空间匹配,我也没有成功使用任何 JPEG。