Я пытаюсь вывести CIImage на диск и ищу наиболее эффективный из возможных способов. Я нашел этот вопрос , который предлагает использовать writeJPEGRepresentation
/ writePNGRepresentation
методы CIContext. Однако всякий раз, когда я пытаюсь использовать эти методы, они создают пустые изображения.
В случае с JPEG он создает чисто черное изображение. PNG производит чистое прозрачное изображение. Метод HEIF также дает чисто черное изображение. Тот же результат, если я использую методы jpegRepresentation
или pngRepresentation
, которые генерируют 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, даже когда цветовое пространство совпадает.