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

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);

}

然而,我做了一些测试,发现这种方法的速度只有当我下载整个图像并检查大小属性时才能达到同样的速度。我原以为这种方法是通过仅下载图像的元数据或标头并在那里检查分辨率来工作的。我错了吗?在objective C中,有没有一种快速获取互联网图像尺寸的方法,而不需要抓取图像?


如果你找不到一个库,而且你只支持一种格式,那么手动处理应该不难(即:读取文件头并自己解析)。http://en.wikipedia.org/wiki/Portable_Network_Graphics http://en.wikipedia.org/wiki/Jpeg - Brian
1个回答

2

大多数图形格式的尺寸存储在头部信息里。如果你局限于一些格式的子集(比如PNG/JPG/GIF),并实现自己的头部解析代码,那么这是可能的。不过需要自己摸索 - Core Graphics 图像API无法处理部分文件。

要从网络请求文件的一部分,可以使用 Range头部信息。但有些Web服务器可能不支持它。请求的字节数应该是支持的格式中的最大头部大小。另外,你可能还想验证头部中的魔术字节。


3
如果您控制Web服务器或中间服务器,您也可以在那里使用图形库来解析所需的元数据,并通过特殊调用返回它。 - Zev Eisenberg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接