imageWithData图像尺寸变大了?

时间:2015-03-04 02:47:32

标签: ios uiimage uiimagejpegrepresentation

我使用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大得多?

1 个答案:

答案 0 :(得分:5)

因为它仍然代表以JPEG允许的最少量数据丢失存储的分辨率图像。

这是一个(不完美的)类比。想象一下,拿一张CD(全音质的音频)并将其翻录成一个非常低质量的MP3文件。那个文件很小,听起来很糟糕。现在使用iTunes将该MP3文件刻录到CD-R上。如果您播放该CD,它仍然听起来很糟糕,但这是可怕的声音数据的全尺寸存储。现在将 CD-R CD-R转换为最高质量的MP3。您是否希望它能够与您刻录CD的低质量MP3一样大小?不,因为您要求iTunes以非常高的质量编码全尺寸声音信号。你正在做很多工作来“保存”高质量的碰巧是一个糟糕的声音数据流。

与您的图片相同。您正在以某个分辨率X * Y获取原始位图。您正在编码它非常有损,它旨在通过丢弃一堆信息占用少量磁盘空间。然后你正在解码它,回到一个完整的X * Y大小的位图,它现在有一套(不同的)复杂性,它们从它被压缩的方式中产生。然后,您以非常高质量编码 位图。这将保留几乎所有可见的复杂性,但仍然看起来很糟糕。

(您确实发现data1data30之间存在重大差异,这是最接近的苹果与苹果之间的比较。data1当您保留尽可能多的信息时会发生什么正如JPEG所允许的那样。data30的大小下降显示了当您首先将其编码为data2时所丢失的内容。)