1

imageWithData メソッドを使用して UIimage を作成します。

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
UIImage *chosenImage = [info objectForKey:@"UIImagePickerControllerOriginalImage"];
NSData *data1 = UIImageJPEGRepresentation(chosenImage, 1);
NSData *data2 = UIImageJPEGRepresentation(chosenImage, 0.5);
NSLog(@"data1 = %lu;;;;;;;data2 = %lu",[data1 length],[data2 length]);

UIImage *nimg = [UIImage imageWithData:data2];
NSData *data30 = UIImageJPEGRepresentation(nimg, 1);
NSData *data31 = UIImageJPEGRepresentation(nimg, 0.8);
NSLog(@"data30 = %lu;;;;;;data31 = %lu;;;;;;",[data30 length],[data31 length]);
}

私はこの出力を得る:

data1 = 1751828;;;;;;;data2 = 254737

data30 = 1368455;;;;;;data31 = 387174;;;;;;

data30 が data2 よりもはるかに大きいのはなぜですか?

4

1 に答える 1

5

それは、JPEG が許容する最小量のデータ損失で保存されたその解像度の画像を依然として表しているからです。

これは(不完全な)アナロジーです。CD (最高品質のオーディオ) を取り、それを非常に低品質の MP3 ファイルにリッピングすることを想像してみてください。そのファイルは非常に小さく、ひどく聞こえます。次に、iTunes を使用してその MP3 ファイルを CD-R に書き込みます。その CD を再生すると、それでもひどいサウンドになりますが、それはひどいサウンド データのフル サイズ ストレージです。そのCD-R を最高品質の MP3 にリッピングします。CD を書き込んだ低品質の MP3 と同じサイズになると思いますか? いいえ、iTunes にフルサイズのサウンド信号を非常に高品質でエンコードするように要求しているためです。質の悪いサウンド データ ストリームを高品質で「保存」するために、多くの作業を行っています。

あなたのイメージと同じです。ある解像度 X*Y で元のビットマップを取得しています。これは、大量の情報を捨てることによって少量のディスク容量を占有するように設計されています。次に、それをデコードして、完全な X*Y サイズのビットマップに戻します。このビットマップには、たまたま圧縮された方法から生じた独自の (異なる) 複雑さのセットがあります。次に、そのビットマップを非常に高品質でエンコードしています。これは、目に見える複雑さのほとんどすべてを保持しますが、それでも見にくいです。

data1(との間には実質的な違いが見られますdata30。これは、ここで最も近いリンゴとリンゴの比較ですdata1。JPEG が許す限り多くの情報を保持するとどうなるかですdata30。最初にエンコードするステップdata2。)

于 2015-03-04T03:34:44.467 に答える