我需要在不下载图像的情况下在线查找图像的尺寸.为此,我这样做:
+ (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);
}
Run Code Online (Sandbox Code Playgroud)
这(下载前100个字节)令人惊讶地工作,我通过这种方式获得了正确的PNG尺寸.
但是我不认为这是一种非常优雅的方法.首先,我选择通过猜测和检查来下载前100个字节,使其尽可能小,同时仍然可以正常工作.
显然在PNG文件中,这个东西在标题中称为IHDR,我必须在它的宽度和高度之后直接找到它.这让我觉得我应该遍历数据并找到这个IHDR并获得维度.问题是,当我NSLog数据时,我得到这样的东西:
... 49484452 000003b7 000001a7 08060000 006c2da0 b100000a 41694343 50494343 2050726f 66696c65 ...
Run Code Online (Sandbox Code Playgroud)
我不知道如何处理我的NSData对象的循环并检测IHDR令牌,然后将之后的内容转换为数字.我也不知道请求只有100个字节的PNG请求太多只是为了得到尺寸,或者它是否要求不够