假设我有一个从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
创建它的。预期它绝对没有标题或应如何显示的其他信息。 因此,第二种情况下显示的其他信息可能会被系统用来构造
CGImage
对象(例如,编码)。但这不是为了显示该信息而需要附加到CGImage
的信息,因为它已经准备好(解码)用于显示了。在标题中,您说的是“CGImage没有属性/元数据(CGImageProperties)”。没有“CGImageProperties”这样的东西,有“CGImageSourceProperties”。因此,具有属性的是源。
因此,我相信这些属性不会被复制,并且没有办法单独从
CGImage
中获取它们。您还可以通过CGImage
直接获得其他属性:您可以检查更多here。
关于ios - CGImage没有属性/元数据(CGImageProperties),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59612711/