【问题标题】:NSData length of an Image compressed with UIImageJPEGRepresentation()使用 UIImageJPEGRepresentation() 压缩的图像的 NSData 长度
【发布时间】:2013-02-25 01:04:52
【问题描述】:

我们知道可以使用方法UIImageJPEGRepresentation() 压缩图像,如下代码所示。

    NSData *imgData = UIImageJPEGRepresentation(imageResized, 0.5);
    NSLog(@"imgData.length :%d",imgData.length);

    imageResized = [UIImage imageWithData:imgData];
    NSData *imgData2 = UIImageJPEGRepresentation(imageResized, 1);

    NSLog(@"imgData2.length :%d",imgData2.length);

日志是:

2013-02-25 00:33:14.756 MyApp[1119:440b] imgData.length :371155
2013-02-25 00:33:20.988 MyApp[1119:440b] imgData2.length :1308415

令我困惑的是为什么imgDataimgData2length 是不同的。在我的应用程序中,图像应该上传到服务器。我应该将NSData 上传到服务器以节省存储空间吗? Android手机是否可以下载NSData并将其转换为图像?任何帮助将不胜感激!

【问题讨论】:

  • 您为什么希望它们具有相同的大小?你知道压缩是什么意思吗?
  • @H2CO3 请看一下接受的答案,你会明白我为什么感到困惑:) 是的,我知道什么是压缩:)

标签: ios uiimage nsdata


【解决方案1】:

您从某个大小(例如 1024x768)的UIImage 开始。这需要 1024x768x4 字节的内存。然后将其压缩为 0.5 倍,得到 371,155 个字节。

然后您使用压缩数据创建一个新的UIImage。这仍然是 1024x768(或其他)UIImage,因此它现在占用与原始图像相同的内存量(1024x768x4)。然后,您将其转换为压缩较少的新 JPG,为您提供 1,308,415 字节。

即使您创建了压缩图像的未压缩版本,字节数也来自转换完整大小的UIImage。第二张未压缩的图像虽然更大,但仍具有与压缩图像相同的较低质量。

由于您的数据代表 JPG,任何下载数据的设备都可以将数据视为 JPG,包括 Android 手机。

【讨论】:

  • 但我想知道为什么在imageResized = [UIImage imageWithData:imgData] 之后,我们得到了原始图像。那很有意思。 @luyuan @rmaddy
  • @demon 你没有得到原始图像。你看过我的回答吗?它解释了第二张图片与原始图片的不同之处。
  • @rmaddy 我读过它并且知道它是一个新图像,但我想知道为什么我们用压缩数据创建一个新图像,然后我们再次从这个新图像中获取数据,但是我们get 是原始日期长度。
  • 内存中的UIImage 是宽 x 高 x 4 字节。文件大小无关紧要。 UIImage 是未压缩的位图。
  • 也许我明白了让我困惑的观点。什么 'UIImageJPEGRepresentation' 压缩对内存没有任何作用,而是其他的,对吧?
【解决方案2】:

第二张图片的字节数更大,因为您向UIImageJPEGRepresentation 传递了更高的压缩质量值。更高的质量需要更多的字节。

上传到服务器后的文件将是标准的 JPEG 文件,任何设备都可以查看,包括 Android。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-06
    相关资源
    最近更新 更多