imageresizer.net性能基准

时间:2013-10-28 11:41:28

标签: c# asp.net performance imageresizer

imageresing.net社区和开发者。

请告诉我有关imageresing.net内部的一些细节。

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

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

  3. 提前致谢,

    安东

1 个答案:

答案 0 :(得分:7)

ImageResizer提供3条成像管道。

  1. GDI +(System.Drawing)默认值。 2通道高品质双三次预处理。提供的质量非常快。 (调整大小为200-300ms。)最近的Windows更新使得GDI +并行化很差,但MSFT正在积极调查这一点。
  2. WIC(WPF也使用的)。速度提高4-8倍(调整大小为20-200ms)。单次调整大小会导致大量波纹伪影并导致模糊(在Fant和双立方模式下)。 Windows Imaging Components中没有真正高质量的大小调整。
  3. FreeImage的。如果您需要支持DSLR格式或访问Lanczos重采样(顶级质量),FreeImage就是您的库。它比其他(通常800-2400ms)慢,大,单片,难以审核,因此我们只建议将其与可信图像数据一起使用。我们使用针对libjpeg-turbo构建的自定义版本的FreeImage,它比libjpeg快得多。
  4. 您可以混合和匹配编码器,解码器和(在某种程度上)调整大小算法。出于质量原因,一些算法在内部实现,而大多数算法在C / C ++中以依赖关系实现。

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

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

    1. 你关心元数据吗?当你禁用元数据解析时,libjpeg-turbo(读取jpegs)的速度要快2-3倍。如果您想根据相机exif数据自动旋转,则需要该信息。
    2. 你关心颜色的正确性吗? Jpeg不是RGB格式。如果它有ICC配置文件,那么正确的做法是在调整大小之前转换为sRGB。那很慢。
    3. 您是否关心调整质量?有一百种方法可以实现双三次大小调整过滤器。有些快,有些慢,最丑,有些准确。 Bicubic WIC!= Bicubic GDI +。你可以得到<在最近邻模式下,ImageResizer WIC端到端20ms - 如果你对视觉效果很酷。
    4. 你关心输出文件的大小吗?如果您愿意花费更多的时钟周期,您可以将PNG / GIF文件大小减少30-80%,将jpeg减少5-15%。如果您想为每个请求添加150-600毫秒,ImageResizer可以创建WebP图像,将带宽成本减半(WebP编码的成本比jpeg更高)。
    5. 你可以理解微基准(在相同的情况下,libjpeg-turbo比libjpeg快40%等)。在排除编码,解码和颜色转换后,您甚至可以比较某些简单的低质量图像大小调整滤镜(最近邻,框,双线性)。

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

      我已经为快速高质量的图像大小调整提供了大量研究,但我们还没有能够匹配GDI +。 ImageResizer的默认配置往往会在许多类型的图像上击败Photoshop质量。

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

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