Как работать с модифицированными файлами DNG в Core Image?


#1

Добрый вечер, ночь и утро, уважаемые соратники разработчики.

В настоящий момент занимаюсь приложением для фотографирования и редактирования фото, где основой является работа с RAW фото в формате DNG.

Так вот. Почти все сделал: Камера снимает, все процессы работают, электроны радостно трутся о кристаллическую решётку кремния в ЦПУ.

Но есть одна проблема, которая отравляет мою радость от проделанной работы.

Дело в том, что кроме собственных фото, в приложение можно импортировать сторонние, например из Фотопленки или из Файлов.

И некоторые фото, которые были предварительно обработаны в других приложениях, имеют странность. Да чего я говорю - изрядно попорчены приложением LightRoom от Adobe. Они что то делают с ним, и я не могу открыть его в исходном разрешении в 12 мп, как они были отсняты на матрицу. Анализ метаданных выявил проблему в установленном разрешении в 1024/768 точек.
Вот что мне выдает запрос image.properties (где image - это объект CIImage) при загрузке фото в память:
Это фото в моем приложении:
[ “PixelWidth”: 4032, “Depth”: 16, “ColorModel”: RGB, “{DNG}”: {
AsShotNeutral = ( “0.4446374”, 1, “0.4797376” );
BaselineExposure = “-1.703154”;
BlackLevel = ( 528 );
BlackLevelRepeatDim = ( 1, 1 );
CFAPlaneColor = ( 0, 1, 2 );
CalibrationIlluminant1 = 17;
CalibrationIlluminant2 = 21;
}, “{Exif}”: {
ApertureValue = “1.695993781059996”;
BrightnessValue = “1.50033462033462”;
LensMake = Apple;
LensModel = “iPhone 8 Plus back camera 3.99mm f/1.8”;
MeteringMode = 5;
PixelXDimension = 4032;
PixelYDimension = 3024;

}, “ProfileName”: Display P3,
LensModel = “iPhone 8 Plus back camera 3.99mm f/1.8”;
}, “PixelHeight”: 3024]

Некоторые ключи поудалял, что бы они не засоряли взор. Но основное ясно: “PixelWidth”: 4032 и “PixelHeight”: 3024 дают нормальное разрешение.

А вот метаданные DNG фото из Лайтрума:

[“Depth”: 8,
“PixelHeight”: 768,
“{DNG}”: {
ActiveArea = (
0,
0,
3024,
4032
);

}, “PixelWidth”: 1024,]

тут конечно не всё, что выдает метод, но ясно одно: Задано разрешение куда ниже исходного. А ActiveArea говорит о 12 мегапикселях.

Кто нибудь знает - как извлечь именно фото RAW? Гуглёж по форумам и документации ответа не дал.

Вот функция для загрузки фото:

func loadImage(_ fileName: String) -> CGImage? {
        
        let fileURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0].appendingPathComponent(fileName)
        guard let image = CIImage(contentsOf: fileURL, options: [CIImageOption.applyOrientationProperty : true]) else {return nil}
        let extent = image.extent
        
        print(image.properties)
        
        guard let cgImage = ContentView.context.createCGImage(image, from: extent) else {return nil}
        return cgImage
    }

Где ContentView.context - это экземпляр CIContext

Заранее благодарю за любые подсказки