【问题标题】:Faster Image Compression/Decompression - Latency Compared to Microsoft's Jpeg更快的图像压缩/解压缩 - 与 Microsoft 的 Jpeg 相比的延迟
【发布时间】:2013-08-08 15:27:42
【问题描述】:

可能有点主观。

但很简单的问题。

什么是最快的图像压缩/解压缩(两者一起)? 我的意思是在 c# 中可用。

我自己很确定这是 Jpeg。

但话说回来,jpeg 多年来一直遵循标准,并且必须遵守某些规则,以免破坏兼容性。

所以也许有更好的东西我不知道?

当我说最快时,我指的是延迟和性能。

意思是,比如说 PNG,压缩一个 1080p 文件需要 1 秒。 解压需要 30 毫秒,然后从位图源到第二个位图,会有 1.030 秒的延迟。

出于许多原因,Jpeg 比 png 快很多,而且它在解压缩时也非常快。和许多其他事情一样,编码器/解码器完成了大部分工作,这意味着即使标准本身可以产生更好的结果,一个糟糕的编码器也会产生更差的结果。

我目前仅限于内置 jpeg 编码器/解码器,因为我还没有完全掌握如何从其他编码器/解码器(libjpeg 等)进行 P/调用,但这与此无关。

所以希望这是一个有效的问题,尽管我认为它可能处于边缘。

编辑:注意到我之前曾问过这个问题,但用另一个术语或叫什么名字。虽然现在我已经写得更具体了。但我认为它几乎是重复的。 我把它交给版主。

【问题讨论】:

  • “最快”的概念是短暂的。相同的压缩(压缩图像不做任何事情,因此不压缩它)肯定比其他任何压缩都快......你所拥有的通常是空间和速度之间的权衡。
  • 是的,确实如此。不知道如何解释我在权衡中搜索的内容。但接近透明和快速的速度是金子价值。即使它比平常大一点,只要它不是 .bmp .png 大小。
  • jpeg 编码速度的 3 个主要方面是 1)颜色转换,2)DCT 变换,3)熵编码。如果您选择较低的质量级别(和较小的输出文件),#3 将花费更少的时间。无论设置如何,其他 2 个进程都需要相同的时间。
  • 好的,使用较低的设置,假设 1(你什么都看不到;))会稍微快一点(然后是其余的 1-3%。但是 100 是非常较慢,但在 85 时,它一直保持大致相同,直到非常小的设置,这些设置实际上并不可用。我喜欢改进其他 2 个设置。将无法访问编码器和解码器以进行自定义设置(当然它会破坏与任何其他解码器的兼容性)。但是尝试一下会很有趣,因为我不关心全局的 Jpeg 兼容性,只是在可能的应用程序中。

标签: c# image jpeg latency


【解决方案1】:

正如您所说,PNG 非常慢。对于 10,000 x 10,000 像素的 RGB 图像,我看到:

$ time vips copy wtc.jpg x.jpg
real    0m0.915s
user    0m1.652s
sys 0m0.052s
$ time vips copy wtc.png x.png
real    0m28.808s
user    0m32.448s
sys 0m0.272s

是时候解压再重新压缩了,real 是挂钟时间,所以慢了大约 30 倍。

其中大部分用于 Deflate 解压缩和重新压缩。 PNG有一个设置压缩级别的选项,0表示不压缩,即。放气关闭。它仍然比 JPEG 慢得多。

$ time vips copy wtc0.png x.png[compression=0]
real    0m6.552s
user    0m8.528s
sys 0m0.440s

大约慢 7 倍,当然关闭压缩后文件会大得多。我不知道为什么 libpng 如此缓慢,如果有人可以制作 libpng-turbo,那就太好了。

TIFF 可能是最广泛使用的最快格式。我明白了:

$ time vips copy wtc.tif x.tif 
real    0m0.637s
user    0m0.432s
sys 0m0.344s

因此比 JPEG 快 50%,不过由于图像未压缩,磁盘上的文件会更大。

像 PPM 这样的格式甚至更快。它们是图像数据的简单转储,带有提供尺寸的小标题。我明白了:

$ time vips copy wtc.ppm x.ppm
real    0m0.336s
user    0m0.196s
sys 0m0.296s

几乎比 JPEG 快 3 倍。同样,缺点是文件会很大,因为没有压缩。

【讨论】:

  • Deflate 和预测器本身就很慢,几乎不可能完全并行化,尽管可以进行权衡。 JPEG 本质上可以扩展到尽可能多的可用内核,并且即使在单核上也具有更少的簿记。这是 1995 年没人会想到的事情之一。
  • 有趣的是,JPEG 编解码器是单线程的。它很快,因为它大量使用 SIMD(向量指令)。您可以获得 zlib 的 SIMD 版本,例如。 zlib-ng,但它们仍然没有那么快。 PNG没有重新启动标记,不幸的是(正如你所说)阻止线程。
  • 您说 JPEG 速度较慢 - 这是在哪个质量级别测试的?因为 JPEG 的 50% 和 100% 质量之间存在巨大差异(视觉上)。
  • 这是默认的Q75。 Q50 只是稍微快一点,尽管 Q95 可能慢 2 倍是对的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-02-22
  • 2011-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-07
相关资源
最近更新 更多