如何在不下载整个图像的情况下获取图像的尺寸?

时间:2013-05-21 19:39:06

标签: ios objective-c image

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

+ (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中的互联网图像中获取图像尺寸?

1 个答案:

答案 0 :(得分:2)

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

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