imageWithData图像尺寸变大了?

问题描述 投票:1回答: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大得多?

ios uiimage uiimagejpegrepresentation
1个回答
5
投票

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

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

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

(你确实看到你的data1data30之间存在重大差异,这是最接近的苹果对苹果比较.data1就是当你保留尽可能多的信息时所发生的事情.Qazxswpoi的大小下降显示你丢失了什么当你首先完成将它编码到data30的步骤时。)

© www.soinside.com 2019 - 2024. All rights reserved.