3

到目前为止,我有这个方法:

+ (CGSize) imageDimensions: (NSString *)url {

NSURL *imageFileURL = [NSURL URLWithString: url];
CGImageSourceRef imageSource = CGImageSourceCreateWithURL((__bridge CFURLRef)imageFileURL, NULL);
if (imageSource == NULL) {
    return CGSizeMake(0, 0);
}

CGFloat width = 0.0f, height = 0.0f;
CFDictionaryRef imageProperties = CGImageSourceCopyPropertiesAtIndex(imageSource, 0, NULL);
if (imageProperties != NULL) {
    CFNumberRef widthNum  = CFDictionaryGetValue(imageProperties, kCGImagePropertyPixelWidth);
    if (widthNum != NULL) {
        CFNumberGetValue(widthNum, kCFNumberFloatType, &width);
    }

    CFNumberRef heightNum = CFDictionaryGetValue(imageProperties, kCGImagePropertyPixelHeight);
    if (heightNum != NULL) {
        CFNumberGetValue(heightNum, kCFNumberFloatType, &height);
    }

    CFRelease(imageProperties);
}

return CGSizeMake(width, height);

}

然而,我正在做一些测试,似乎这个方法的运行速度与我下载整个图像并检查 size 属性一样快。我原以为这种方法只需下载图像的元数据或标题并在那里检查分辨率即可。我错了吗?有没有一种快速的方法可以在不抓取图像的情况下尽快从目标 C 中的互联网图像中获取图像尺寸?

4

1 回答 1

2

大多数图形格式的尺寸都存储在标题中。如果您将自己限制为格式的子集(例如 PNG/JPG/GIF),并实现自己的标头解析代码,那么这是可能的。不过,您将独自一人 - Core Graphics 图像 API 不适用于部分文件。

要从 'Net 请求文件的一部分,您可以使用Range标头。不过,有些 Web 服务器可能不支持它。请求支持格式的标头大小中最大的字节数。此外,您可能想要验证标头中的魔术字节。

于 2013-05-21T19:46:29.987 回答