2013-10-28 65 views
1

imageresing.net社区和开发人员。imageresizer.net性能基准

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

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

  2. 是否有性能基准?我想与其他图书馆比较imageresing.net:libjpeg的,英特尔集成性能基元等

由于提前,

安东

回答

7

ImageResizer提供3条图像管线。

  1. GDI +(System.Drawing)默认值。双通高质量双三次预平滑。提供的质量非常快。 (调整大小需要200-300ms的平均时间)最近的Windows更新使得GDI +并行处理效果不佳,但MSFT正在积极调查此问题。
  2. WIC(什么WPF也使用)。更快4-8倍(20-200毫秒调整大小)。单次调整大小会导致大量的莫尔条纹,并导致模糊(在Fant和Bicubic模式中)。 Windows Imaging Components中没有可用的高质量调整大小。
  3. FreeImage。如果您需要支持DSLR格式或访问Lanczos重新采样(顶级质量),FreeImage是您的图书馆。它比其他人慢(通常为800-2400ms),较大,庞大且难以审核,因此我们只建议将它与可信图像数据一起使用。我们使用针对libjpeg-turbo构建的FreeImage的定制版本,这比libjpeg快得多。

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

端到端比较如果您关心照片质量,基准测试是有点荒谬的,因为您永远无法比较苹果和苹果。回到2011, I did some benchmarks between GDI+ and WIC,但摄影师和图形设计师倾向于发现WIC图像质量不可接受,所以它不是特别公平。

我们定期基准每个管道对自身发现的性能改进或回归,但比较管道可能具有欺骗性的原因有NUMER:

  1. 你关心的元数据?当您禁用元数据分析时,libjpeg-turbo在阅读jpegs时速度(奇怪)是2-3倍。如果你想基于相机exif数据自动旋转,你需要这些信息。
  2. 你关心色彩的正确性吗? Jpeg不是RGB格式。如果它具有ICC配置文件,则正确的做法是在调整大小之前将其转换为sRGB。这很慢。
  3. 你关心调整质量吗?有一百种方法来实现双三次调整大小过滤器。一些快速,一些缓慢,最难看,一些准确。 Bicubic WIC!=双立方GDI +。如果您对视觉效果感到很冷静,您可以将< 20ms端对端地从ImageResizer WIC中以最近邻居模式获得。
  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上,因此,如果您找到的东西快,你想演示作为一个插件或备用管道,我们非常乐意听到它。