我使用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大得多?
因为它仍然代表以JPEG允许的最小数据丢失量存储的分辨率的图像。
这里有一个(不完美的)类比。想象一下,拿一张CD(全质量音频),把它翻录成一个非常低质量的MP3文件。那个文件会很小,而且听起来很糟糕。现在使用iTunes将MP3文件刻录到CD-R上。如果你播放那张CD,它听起来仍然很糟糕,但那是一个可怕声音数据的全尺寸存储。现在把那张CD-R撕成最高质量的MP3。你希望它能产生与你刻录CD时的低质量MP3相同的大小吗?不,因为你要求iTunes以非常高的质量对全尺寸声音信号进行编码。你正在做大量的工作来以高质量"保存"恰好是一个糟糕的声音数据流。
与您的图片相同。您正在拍摄某个分辨率为X*Y的原始位图。你对它的编码非常混乱,这是为了通过抛出一堆信息来占用少量磁盘空间。然后你要解码它,回到一个完整的X*Y大小的位图,它现在有自己的一组(不同的)复杂性,这些复杂性来自于它被压缩的方式。然后,您正在以非常高质量的对的位图进行编码。它将保留几乎所有可见的复杂性,但看起来仍然很粗糙。
(您确实看到了data1
和data30
之间的实质性差异,这是最接近苹果与苹果的比较。data1
是当您保留尽可能多的JPEG允许的信息时会发生的情况。data30
的大小下降显示了当您首先将其编码为data2
时所丢失的内容。)