1

imageresing.net 社区和开发人员。

请澄清一下有关 imageresing.net 内部的一些细节。

  1. imageresing.net 是否使用 .NET 绘图库重新压缩 jpeg?如果不是 - 它是否使用第 3 方引擎或一些内部算法?

  2. 是否有性能基准?我想将 imageresing.net 与其他库进行比较:libjpeg、Intel Integrated Performance Primitives 等。

提前致谢,

安东

4

1 回答 1

7

ImageResizer 提供 3 个成像管道。

  1. GDI+ (System.Drawing) 默认值。2-pass 高品质双三次预平滑。提供的质量非常快。(调整大小的平均时间为 200-300 毫秒。)最近的 Windows 更新使 GDI+ 的并行性很差,但 MSFT 正在积极研究这一点。
  2. WIC(什么 WPF 也使用)。速度提高 4-8 倍(调整大小需要 20-200 毫秒)。单次调整大小会导致大量的波纹伪影并导致模糊(在 Fant 和 Bicubic 模式下)。Windows 映像组件中没有真正高质量的调整大小。
  3. 免费图片。如果您需要支持 DSLR 格式或访问 Lanczos 重采样(顶级质量),FreeImage 就是您的库。它比其他的慢(通常为 800-2400 毫秒)、大型、单片且难以审核,因此我们仅建议将其与受信任的图像数据一起使用。我们使用针对 libjpeg-turbo 构建的自定义版本的 FreeImage,它比 libjpeg 快得多。

您可以混合和匹配编码器、解码器和(在某种程度上)调整大小的算法。出于质量原因,一些算法是在内部实现的,而大多数是在依赖项中用 C/C++ 实现的。

如果您关心照片质量,那么端到端比较基准测试有点荒谬,因为您永远无法将苹果与苹果进行比较。早在2011 年,我在 GDI+ 和 WIC 之间做了一些基准测试,但是摄影师和图形设计师往往会发现 WIC 图像质量不可接受,所以这不是特别公平。

我们定期对每个管道进行自我基准测试,以检测性能改进或回归,但比较管道可能具有欺骗性,原因有很多:

  1. 你关心元数据吗?当您禁用元数据解析时,libjpeg-turbo 在读取 jpeg 时(奇怪地)快 2-3 倍。如果您想根据相机 exif 数据自动旋转,则需要该信息。
  2. 你关心颜色正确性吗?Jpeg 不是 RGB 格式。如果它有 ICC 配置文件,正确的做法是在调整大小之前转换为 sRGB。那很慢。
  3. 你关心调整大小的质量吗?有一百种方法可以实现双三次调整大小过滤器。有些快,有些慢,最丑陋,有些准确。双三次 WIC != 双三次 GDI+。在最近邻模式下,您可以从 ImageResizer WIC 中获得 < 20 毫秒的端到端时间 - 如果您对视觉结果感到满意的话。
  4. 你关心输出文件的大小吗?如果您愿意花费更多的时钟周期,您可以减少 30-80% 的 PNG/GIF 文件大小和 5-15% 的 jpeg。如果您想为每个请求增加 150-600 毫秒,ImageResizer 可以创建 WebP 图像,将您的带宽成本减半(WebP 的编码成本比 jpeg 高)。

您可以理解微基准(在相同情况下,libjpeg-turbo 比 libjpeg 快 40% 等)。您甚至可以在排除编码、解码和颜色转换后比较某些简单的低质量图像大小调整过滤器(最近邻、框、双线性)。

问题是真正高质量的大小调整非常复杂,而且从来没有两次以相同的方式实现。有极少数高质量的实现,甚至更少的具有亚秒级性能的实现。我订购了十几本关于图像处理的教科书,看看是否能找到参考实现,但这个话题……大多数人都熟练地回避了,其他人只是简单地触及到了这个话题。从未提及边缘像素处理、预过滤和性能优化。

我已经资助了很多关于快速高质量图像调整大小的研究,但我们还无法匹配 GDI+。ImageResizer 的默认配置在许多类型的图像上往往优于 Photoshop 质量。

在不久的将来,第四个管道可能会添加到 ImageResizer,基于我们的 libgd 分支和自定义调整大小算法。目前还没有承诺,但我们可能拥有与 GDI+几乎一样高的质量,具有类似的单线程(但更好的并发)性能。

我们所有的源代码都在 GitHub 上,因此,如果您发现想要快速演示为插件或替代管道的东西,我们很乐意听到。

于 2013-10-28T19:30:08.663 回答