imageresizer.net 性能基准

本文关键字:基准 性能 net imageresizer | 更新日期: 2023-09-27 18:37:03

imageresing.net 社区和开发人员。

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

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

  2. 是否有性能基准?我想将 imageresing.net 与其他库进行比较:libjpeg,英特尔集成性能基元等。

提前感谢,

安东

imageresizer.net 性能基准

ImageResizer 提供 3 个成像管道。

  1. GDI+ (系统绘图) 默认值。 具有预平滑功能的 2 次高质量双立方。提供的质量非常快。(平均 200-300 毫秒用于调整大小。最近的Windows更新使GDI+并行化不佳,但MSFT正在积极调查此问题。
  2. WIC (WPF 也使用什么)。 快 4-8 倍(调整大小为 20-200 毫秒)。单通道调整大小会导致大量摩尔纹伪像并导致模糊(在范特和双三次模式下)。Windows 映像组件中没有真正高质量的大小调整可用。
  3. 免费图片。如果您需要支持数码单反相机格式或访问 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+。
  4. 你关心输出文件大小吗?如果您愿意花费更多的时钟周期,则可以将PNG/GIF文件大小减少30-80%,在jpeg中减少5-15%。如果您想为每个请求添加 150-600 毫秒,ImageResizer 可以创建将带宽成本减半的 WebP 图像(WebP 的编码成本高于 jpeg)。

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

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

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

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

我们所有的源代码都在 GitHub 上,所以如果你发现一些快速的东西,你想作为插件或备用管道进行演示,我们很乐意听到它。