Я пытаюсь вывести 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, даже если цветовое пространство совпадает.
CIContext
за пределами области, в которой вы вызываетеwriteJPEGRepresentation
? - person Frank Schlegel   schedule 02.05.2020