假设我有一个从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

(注意:以上示例can be found here中使用的图像。)

最佳答案

CGImage应该完全是原始位图数据。最少一组未压缩的数据,即使在视觉上也可以呈现图像。来自docs“位图图像或图像蒙版”。

实际上,我很惊讶您能够以两种不同的方式使用CGImageSourceCreateWithData构造源:

  • 在第一种情况下,您是直接从原始的未压缩数据CGImage创建它的。预期它绝对没有标题或应如何显示的其他信息。
  • 在第二种情况下,您是从JPEG数据创建的,JPEG是压缩的数据,其标头可能包含许多不同的信息。某些信息可能是完全不相关的,例如图像拍摄地点的坐标或拍摄日期。

  • 因此,第二种情况下显示的其他信息可能会被系统用来构造CGImage对象(例如,编码)。但这不是为了显示该信息而需要附加到CGImage的信息,因为它已经准备好(解码)用于显示了。

    在标题中,您说的是“CGImage没有属性/元数据(CGImageProperties)”。没有“CGImageProperties”这样的东西,有“CGImageSourceProperties”。因此,具有属性的是源。

    因此,我相信这些属性不会被复制,并且没有办法单独从CGImage中获取它们。您还可以通过CGImage直接获得其他属性:
  • cgImage.width
  • cgImage.height
  • cgImage.alphaInfo
  • cgImage.bitmapInfo
  • cgImage.bitsPerComponent
  • cgImage.colorSpace
  • ...

  • 您可以检查更多here

    关于ios - CGImage没有属性/元数据(CGImageProperties),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59612711/

    10-12 21:42