为啥使用 UIImageJPEGRepresentation 和通过 localpath 获取图像之间的相同图像的数据大小/长度不同
Posted
技术标签:
【中文标题】为啥使用 UIImageJPEGRepresentation 和通过 localpath 获取图像之间的相同图像的数据大小/长度不同【英文标题】:Why data sizes/lengths are different for the same image between with UIImageJPEGRepresentation and get image by localpath为什么使用 UIImageJPEGRepresentation 和通过 localpath 获取图像之间的相同图像的数据大小/长度不同 【发布时间】:2017-04-19 08:11:28 【问题描述】: - (void)imagePickerController:(TZImagePickerController *)picker
didFinishPickingPhotoModes:(NSArray<RHPhotoModel *> *)photos
sourceAssets:(NSArray *)assets
isSelectOriginalPhoto:(BOOL)isSelectOriginalPhoto
infoArray:(NSArray *)infoArray
for (RHPhotoModel *model in photos)
UIImage *tmpImage = [UIImage imageWithContentsOfFile:model.photoPath];
NSData *data1 = UIImageJPEGRepresentation(tmpImage,1);
NSData *data2 = [NSData dataWithContentsOfFile:model.photoPath];
UIImage *image = [UIImage imageWithData:data2];
NSData *data3 = UIImageJPEGRepresentation(image,1);
NSLog(@"data1=%lu, data2=%lu, data3=%lu", (unsigned long)data1.length, (unsigned long)data2.length, (unsigned long)data3.length);
[self dismissViewControllerAnimated:YES completion:nil];
使用上述方法完成包含图片photoPath的PhotoModel; 为什么我使用 [NSData dataWithContentsOfFile:model.photoPath]; data2 是 2497519 字节; 但是,我使用 UIImage *tmpImage = [UIImage imageWithContentsOfFile:model.photoPath]; NSData *data1 = UIImageJPEGRepresentation(tmpImage,1); data1 为 7234468 字节;
NSLog 数据:data1 = 7234468(字节),data2 = 2497519(字节),data3 = 7234468(字节)
enter image description here
【问题讨论】:
JPEG 不是这样(系统不同),但这是一个类比:假设您有一个 20*20 的图像。如果您以 1 的质量进行转换,它将每个像素保存在 8 个字节中。现在,如果您以 0.5 的质量进行转换,它会将每个像素保存为 4 个字节,无论之前的质量如何,每个像素都将保存为一个字节。因此 data1 和 data3 具有相同的字节数是正常的。现在,我不知道用于保存原始图像的质量是什么。 你有什么问题? 我想他是在问为什么同一张图片的数据大小/长度不同。 【参考方案1】:这就是JPEG
格式的用途——“压缩数据”。有关.jpg
格式的信息可以在***here 上找到。然而,这背后的数学可能有点复杂。
基本思想是我们希望相同的图像数据以更小的尺寸保存,因此我们使用不同的压缩算法将图像转换为更小的图像。压缩数据可以是lossy
或lossless
。例如,PNG
是无损压缩的,这意味着质量将保持不变,而JPEG
更常用作有损压缩。
只需将压缩视为计算机上的ZIP
文件,它会使文件变小。在 Xcode 中,当压缩质量设置为 1 时,JPEG
文件的大小可能会大于原始文件。但是,使用较低的压缩质量会导致压缩文件变得更加模糊或颜色怪异。
根据我的经验,我意识到将压缩质量设置为 0.4~0.5 可以在文件大小适中的情况下保持更好的质量。希望这会有所帮助:)
【讨论】:
以上是关于为啥使用 UIImageJPEGRepresentation 和通过 localpath 获取图像之间的相同图像的数据大小/长度不同的主要内容,如果未能解决你的问题,请参考以下文章
为啥在参数周围使用 /*、*/ 以及为啥在提取数组长度时使用 >>>? [复制]
为啥我们使用 hadoop mapreduce 进行数据处理?为啥不在本地机器上做呢?
为啥 CoreGui Roblox 锁定在 DataModel 中,为啥受信任的用户不能使用 CoreScripts?