为啥使用 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 上找到。然而,这背后的数学可能有点复杂。

基本思想是我们希望相同的图像数据以更小的尺寸保存,因此我们使用不同的压缩算法将图像转换为更小的图像。压缩数据可以是lossylossless。例如,PNG 是无损压缩的,这意味着质量将保持不变,而JPEG 更常用作有损压缩。

只需将压缩视为计算机上的ZIP 文件,它会使文件变小。在 Xcode 中,当压缩质量设置为 1 时,JPEG 文件的大小可能会大于原始文件。但是,使用较低的压缩质量会导致压缩文件变得更加模糊或颜色怪异。

根据我的经验,我意识到将压缩质量设置为 0.4~0.5 可以在文件大小适中的情况下保持更好的质量。希望这会有所帮助:)

【讨论】:

以上是关于为啥使用 UIImageJPEGRepresentation 和通过 localpath 获取图像之间的相同图像的数据大小/长度不同的主要内容,如果未能解决你的问题,请参考以下文章

为啥或为啥不在 C++ 中使用 memset? [关闭]

为啥在参数周围使用 /*、*/ 以及为啥在提取数组长度时使用 >>>? [复制]

为啥我们使用 hadoop mapreduce 进行数据处理?为啥不在本地机器上做呢?

为啥 CoreGui Roblox 锁定在 DataModel 中,为啥受信任的用户不能使用 CoreScripts?

为啥有人应该在 git commit 之前使用 git add?或者为啥有人应该使用 git add 呢?

为啥刷新令牌更安全?如果刷新令牌也可能被盗,为啥我们还要使用它?