CGImage не имеет свойств / метаданных (CGImageProperties) - PullRequest
1 голос
/ 06 января 2020

Скажем, у меня есть CGImage, который был загружен из некоторого URL, и я хочу извлечь его свойства через CGImageSourceCopyPropertiesAtIndex:

// Playground

import SwiftUI

func printPropertiesOf(_ image: CGImage) {
    guard let dataProvider = image.dataProvider else {
        print("Couldn't get the data provider.")
        return
    }
    guard let data = dataProvider.data else {
        print("Couldn't get the data.")
        return
    }
    guard let source = CGImageSourceCreateWithData(data, nil) else {
        print("Couldn't get the source.")
        return
    }
    guard let properties = CGImageSourceCopyPropertiesAtIndex(source, 0, nil) else {
        print("Couldn't get the properties.")
        return
    }
    print(properties)
}

let url = Bundle.main.url(forResource: "Landscape/Landscape_0", withExtension: "jpg")!
let source = CGImageSourceCreateWithURL(url as CFURL, nil)!
let cgImage = CGImageSourceCreateImageAtIndex(source, 0, nil)!

printPropertiesOf(cgImage)

Вывод:

Не удалось получить свойства.


Но если я использую URL, где находится изображение, вместо CGImage:

// Playground

import SwiftUI

func printPropertiesOfImageIn(_ url: URL) {
    guard let data = try? Data(contentsOf: url) else {
        print("Couldn't get the data.")
        return
    }
    guard let source = CGImageSourceCreateWithData(data as CFData, nil) else {
        print("Couldn't get the source.")
        return
    }
    guard let properties = CGImageSourceCopyPropertiesAtIndex(source, 0, nil) else {
        print("Couldn't get the properties.")
        return
    }
    print(properties)
}

let url = Bundle.main.url(forResource: "Landscape/Landscape_0", withExtension: "jpg")!
let source = CGImageSourceCreateWithURL(url as CFURL, nil)!
let cgImage = CGImageSourceCreateImageAtIndex(source, 0, nil)!

printPropertiesOfImageIn(url)

Вывод:

{
    ColorModel = RGB;
    DPIHeight = 72;
    DPIWidth = 72;
    Depth = 8;
    PixelHeight = 1200;
    PixelWidth = 1800;
    "{JFIF}" =     {
        DensityUnit = 1;
        JFIFVersion =         (
            1,
            0,
            1
        );
        XDensity = 72;
        YDensity = 72;
    };
    "{TIFF}" =     {
        Orientation = 0;
        ResolutionUnit = 2;
        XResolution = 72;
        YResolution = 72;
    };
}


Есть ли способ извлечь метаданные из самого CGImage, не полагаясь на его источник URL?

Если нет, есть ли способ узнать источник URL данного CGImage?

(Примечание: изображение, использованное в приведенных выше примерах можно найти здесь .)

1 Ответ

3 голосов
/ 06 января 2020

CGImage должен быть полностью необработанными растровыми данными. Минимальный набор несжатых данных для визуального представления даже изображения. Из документов «Растровое изображение или маска изображения».

Я действительно удивлен, что вы смогли создать источник, используя CGImageSourceCreateWithData двумя такими разными способами:

  • В первом случае вы создаете его непосредственно из необработанных несжатых данных, которые являются вашими CGImage. Ожидается, что он не имеет абсолютно никаких заголовков или дополнительной информации о том, как это должно быть показано.

  • Во втором случае вы создаете его из данных JPEG, которые представляют собой сжатые данные с заголовками, которые могут содержать много разной информации. Некоторая информация может быть совершенно не связана, например, координаты места, где было снято изображение, или, например, дата его съемки.

Так что дополнительная информация, которую вы показываете во втором случае, потенциально может использоваться системой для создания объекта CGImage (например, кодирование). Но это не та информация, которую нужно добавлять в CGImage для ее отображения, поскольку она уже подготовлена ​​(декодирована) для представления.

В заголовке вы говорите: «CGImage не имеет свойств / метаданных (CGImageProperties)». Нет такой вещи как «CGImageProperties», есть «CGImageSourceProperties». Так что именно источник обладает свойствами.

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

  • cgImage.width
  • cgImage.height
  • cgImage.alphaInfo
  • cgImage.bitmapInfo
  • cgImage.bitsPerComponent
  • cgImage.colorSpace
  • ...

Вы можете проверить чуть больше здесь .

...