imageWithData图像大小变大



我使用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大小的位图,它现在有自己的一组(不同的)复杂性,这些复杂性来自于它被压缩的方式。然后,您正在以非常高质量的位图进行编码。它将保留几乎所有可见的复杂性,但看起来仍然很粗糙。

(您确实看到了data1data30之间的实质性差异,这是最接近苹果与苹果的比较。data1是当您保留尽可能多的JPEG允许的信息时会发生的情况。data30的大小下降显示了当您首先将其编码为data2时所丢失的内容。)

相关内容

  • 没有找到相关文章

最新更新