![压缩程度更高的 PNG 图像是否需要更长时间才能加载?](https://linux22.com/image/1404987/%E5%8E%8B%E7%BC%A9%E7%A8%8B%E5%BA%A6%E6%9B%B4%E9%AB%98%E7%9A%84%20PNG%20%E5%9B%BE%E5%83%8F%E6%98%AF%E5%90%A6%E9%9C%80%E8%A6%81%E6%9B%B4%E9%95%BF%E6%97%B6%E9%97%B4%E6%89%8D%E8%83%BD%E5%8A%A0%E8%BD%BD%EF%BC%9F.png)
当我创建磁盘空间非常小的 PNG 文件时,我往往会想知道文件大小是否变得比查看者解压图像所需的时间更重要。从技术上讲,这也是微不足道的,但我已经思考了很长时间。我们都知道,压缩程度更高的 PNG 图像需要更长的时间来压缩,但它们解压所需的时间是否更长?
我不知道这些信息是否会影响问题,但我对图标类型文件(由于包含的像素很少所以很小)和大型线条艺术文件(由于它们能非常有效地压缩像素所以很小)的关系感到疑惑。
编辑:针对我收到的答案,我想指出,这不仅仅是网络问题。Windows 用户可能不会注意到这一点,但桌面环境使用的大多数图标都是用 PNG 压缩存储的,其中数十个图标需要在系统启动时渲染。我提到的巨大线条艺术主要是桌面壁纸,就像http://simpledesktops.com/,但各种海报、电子游戏资源和其他东西也符合该描述。
答案1
压缩程度更好的图像(即文件大小较小)通常比尺寸较大的相同图像花费更少的加载时间。
如果您想在保存 PNG 文件时最小化文件大小,那么就需要牺牲压缩文件所需的时间。
PNG 使用 DEFLATE(与 zlib 和 PKZIP 中使用的算法相同)压缩图像数据。DEFLATE 节省空间的一种方法是仅通过提供运行长度和回到流中先前出现位置的距离来编码重复的字节序列。(例如,A B C D E F A B C A B C D
可以编码为A B C D E F [3,-6] [4,-9]
。(它也可以将其编码为A B C D E F [3,-6] [3,-3] D
。)
压缩器必须使用算法来查找匹配的序列,然后才能对其进行编码。算法各不相同,但使用某些参数可以使其中许多算法工作得更努力或运行得更快。当算法工作得更努力时,它可能会找到更多或更长的匹配,这通常会产生更好的压缩效果,但需要更长的时间来完成。
相比之下,解压缩算法非常简单并且不需要做太多工作 - 它只是以相当线性的方式解码流,并且它不必搜索匹配项,因为它们由压缩器提供 - 它只需查找提供给它的长度/距离代码。
一般来说,读取的位数越少,PNG 解压缩的速度就越快。
答案2
我为你做了一个小实验 - 它并不完美,但它应该能让你了解问题的范围。
我在网上找到了一个大型 PNG 文件,在 GIMP 中打开它并保存了 2 个版本 - 1 个压缩级别为 9(非常小),1 个压缩级别为 0(大)。
高度压缩的文件为 1.8 MB,轻度压缩的 png 为 4.7 MB。图片是我从 Google 上截取的,是一张星团的图片。
然后我编写了一个脚本,将图像从 png 转换为 tif(假设 TIF 是一种相对未压缩的文件格式,因此速度非常快)200 次并计时输出。在每种情况下,我都快速运行脚本并在几秒钟后中止它,以便任何系统缓存都可以在运行完整测试之前生效,从而减少磁盘 io 的影响(我的电脑恰好使用 SSD,这也将这种影响降到最低)。结果如下:
Converting the small file 200 times - 1 minute, 16.07 seconds
Converting the large file 200 times - 1 minute, 22.39 seconds
因此,高度压缩的文件的解压缩速度似乎比轻度压缩的文件慢 10 倍左右。
但是,这没有考虑下载文件所需的时间。当然,这取决于您的连接速度、与服务器的距离以及文件的大小。如果传输大文件比传输小文件多花费约 0.5 秒,那么(在我的系统上 - 这是一台较旧的超极本,因此速度很慢,因此给出了一个保守的场景),最好发送压缩程度更高的文件。在这种情况下 - 这意味着每秒发送 5.8 兆字节,这相当于 - 非常粗略地,每秒 60 兆比特 - 不包括延迟问题。
对于大文件的结论 - 如果您在使用率较低的 LAN 上,使用压缩程度较低的图像可能会更快,但一旦您访问更广泛的互联网,使用压缩程度更高的文件会更好。
顺便说一句,我正在重新运行 1000 次迭代测试,一旦我获得这些数字,我就会更新我的帖子 - 我希望它们非常相似。
答案3
不,事实上,您只需拉出一个 64 像素的 png 和一个 64 像素的 jpg,就能看到解压所需的时间是如此之小,以至于微不足道……就在您意识到自己花了太多时间思考这个问题之前。:) 因为我们正在讨论构成图标的像素所涉及的如此小尺寸的图像。随着尺寸的增加,jpg 作为有损格式也无法很好地保留图像。这就是 png 作为无损格式真正闪耀的地方。
从技术上讲,您说得对,由于无需解压 png 等无损格式,性能提升可以节省几毫秒,但这一点可能对您没有多大帮助,因为您无法用节省的时间做任何事情。Jpg 之所以有用,是因为它在 64 像素下仍能保持 90% 的质量,尽管它会降低到原始细节的一小部分,但太小而无法注意到。PNG 几乎同样方便,而其无损格式的质量完全没有受到影响,在我看来,它是更好的选择。
您长期思考这个问题的背后有什么实际原因吗?
因此,如果您对如何处理“巨大的线条图文件”存在一些合理的疑问,那么更好地了解您认为的“巨大的线条图文件”会有所帮助。