画像をダウンロードせずにオンラインで画像の寸法を見つける必要があります。これを達成するために、私はこれを行います:
+ (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 バイトだけを要求することが、サイズを取得するためだけに要求しすぎているのか、それとも要求が不十分なのかについてもわかりません。