いくつかの観察:
あなたの質問は、のサイズを取得する試みNSData
が失敗したと推定しました。ではない。aのサイズを取得する正しい方法は、をNSData
使用することですlength
。
ただし、混乱は、外部で生成されたJPEGをラウンドトリップで取得するUIImage
とUIImageJPEGRepresentation
、同じが生成されるという誤った仮定に起因しNSData
ます。これは非常にありそうになかったでしょう。変更された可能性のあるさまざまなJPG設定が多すぎます(JPEG Wikipediaページを参照)。元のファイルがどの設定を使用したかは確かにわかりません。私はそれを知っているかUIImage
、UIImageJPEGRepresentation
ファイルの色空間を変更しました。私はそれが他の多くのこともしていると賭けたいと思います。
したがって、結果は正しいです。元のファイルは2.6MBで、結果のファイルは4.5MBでした。compressionQuality
を1.0から0.99に変更すると、結果のファイルはわずか1.4MBになります。ただし、元のファイルが必要な場合は、最初に保存してください(以下のように)。
画像ファイルをダウンロードして保存し、にロードし、UIImage
を介して再抽出しUIImageJPEGRepresentation
、画像の別のコピーを保存する次のコードについて考えてみます。
// let's make filenames where we'll store the files
NSString *documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSString *suncomboOrig = [documentsPath stringByAppendingPathExtension:@"suncombo1-orig.jpg"];
NSString *suncomboReprocessed = [documentsPath stringByAppendingPathExtension:@"suncombo1-reprocessed.jpg"];
// let's download the original suncombo1.jpg and save it in Documents and display the size
NSURL *url = [NSURL URLWithString:@"http://lasp.colorado.edu/home/wp-content/uploads/2011/03/suncombo1.jpg"];
NSData *data = [NSData dataWithContentsOfURL:url];
NSLog(@"original = %d", [data length]);
[data writeToFile:suncomboOrig atomically:NO];
// let's load that into a UIImage
UIImage *image = [UIImage imageWithData:data];
// let's extract data out of the image and write that to Documents, too, also logging the size of that
NSData *data2 = UIImageJPEGRepresentation(image, 1.0);
NSLog(@"reprocessed = %d", [data2 length]);
[data2 writeToFile:suncomboReprocessed atomically:NO];
それは何を報告しますか:
2012-12-13 22:30:39.576 imageapp [90647:c07] original = 2569128
2012-12-13 22:30:40.141 imageapp [90647:c07]再処理= 4382876
したがって、最初に保存したファイル(サーバー上にあるものと同じだと思われます)は2.5 MBであり、へのラウンドトリップを実行した後のファイルは4.3MBをUIImage
介して再抽出されました。上記のコードで保存された2つのファイルを見ると、これらのNSData
サイズが正しいことが確認できます。
私の最初の答えは、OPがのサイズを取得できなかったかNSData
、単純な質問の根底にある微妙な問題(ダウンロードが開始される前にサイズを取得したいなど)があったという推定に基づいていました。とにかく、私は上記の答えを拡張しましたが、歴史的な目的のために元の答えを保持します:
元の回答:
NSData
プロパティは、length
ダウンロードされたバイト数を示します。例[data2 length]
:
それが本当に大きい場合は、NSURLConnection
非同期でダウンロードするために使用できます。これは、Webサーバーによっては、メソッドでダウンロードが開始される前にdidReceiveResponse
(パラメーターのexpectedContentLength
プロパティを使用して)合計ファイルサイズを提供する場合があります。NSHTTPURLResponse *response
ダウンロードのもう1つの優れた点NSURLConnection
は、ダウンロード時にファイル全体をメモリにロードする必要がなく、永続ストレージに直接ストリーミングできることです。これは、複数の大きなファイルをダウンロードする場合に特に便利です。同時に。適度なサイズのファイルをダウンロードする場合、NSURLConnection
ダウンロードに使用するのはやり過ぎですが、大きなファイルをダウンロードするときに進行状況インジケーターが必要な場合(またはダウンロードを開始する前にファイルサイズを取得したい場合)に便利です。
ただし、にダウンロードされたバイト数を知りたいだけの場合はNSData
、を使用してくださいlength
。