我需要在不下载图像的情况下在线查找图像的尺寸。为此,我这样做:
+ (CGSize) getImageDimensions:(NSString *)url {
// Send a synchronous request
NSMutableURLRequest * urlRequest = [NSMutableURLRequest requestWithURL:[NSURL URLWithString: url]];
NSString *rangeString = [url hasSuffix: @"png"] ? @"bytes=0-100" : @"bytes=0-1300";
[urlRequest setValue:rangeString forHTTPHeaderField:@"Range"];
NSURLResponse * response = nil;
NSError * error = nil;
NSData * data = [NSURLConnection sendSynchronousRequest:urlRequest
returningResponse:&response
error:&error];
if (error == nil)
return [UIImage imageWithData: data].size;
else
return CGSizeMake(0, 0);
}
这(下载前 100 个字节)出人意料地有效,我通过这种方式获得了 PNG 的正确尺寸。
但是我不认为这是一个非常优雅的方法。首先,我选择通过猜测和检查来下载前 100 个字节,使其尽可能小,同时仍然可以正常工作。
显然,在 PNG 文件中,标题中有一个称为 IHDR 的东西,我必须找到它,然后是宽度和高度。这给我的印象是我应该遍历数据并找到这个 IHDR 并获取尺寸。问题是,当我 NSLog 数据时,我得到如下信息:
... 49484452 000003b7 000001a7 08060000 006c2da0 b100000a 41694343 50494343 2050726f 66696c65 ...
我不知道如何处理循环遍历我的 NSData 对象并检测 IHDR 令牌,然后将其后的内容转换为数字。我也不知道只为 PNG 请求 100 个字节是否只是为了获取尺寸而请求太多,或者它是否请求不够