CIContext JPEG / PNG выходные функции, производящие чистые изображения - PullRequest
1 голос
/ 02 мая 2020

Я пытаюсь вывести 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, даже когда цветовое пространство совпадает.

1 Ответ

1 голос
/ 04 мая 2020

Как вы сказали, похоже, это проблема исключительно для симулятора. Однако я сделал еще несколько копаний и обнаружил следующее:

При проверке того, что делает Core Image (установив переменную окружения CI_PRINT_TREE), я обнаружил, что дерево выглядит нормально (хотя получающееся изображение черное) , Однако , для рабочих конфигураций ничего не печаталось вообще! Мне кажется, что Core Image фактически не выполняет никакого рендеринга, но, возможно, Image I / O используется непосредственно для написания JPG.

, что заставило меня попытаться заставить Core Image использовать программный рендерер (вместо его по умолчанию Metal Renderer), передав CIContextOption.useSoftwareRenderer при создании контекста. Тем не менее, это полностью игнорируется. Результирующий контекст по-прежнему остается металлическим контекстом ...

Так что, да, кажется, единственный возможный обходной путь - это прямо сейчас через CGImage. Было бы здорово, если бы вы сообщили об ошибке в Apple.

...