.NET中最快的图像调整大小方法

8
我需要最快的库来调整全尺寸图像(一些大小达到9MB)到多个尺寸。以下是场景:
- 用户上传照片 - FileSystemWatcher 在服务中运行,监视SAN上的放置位置 - 当出现新照片时,服务将创建4个图像版本,具有完整的JPEG质量:
- 100像素宽 - 320像素宽 - 640像素宽 - 1280像素宽
我不关心库是C/C++还是其他任何语言,只要我可以通过.NET访问它就可以。此外,这将需要扩展到可能有1,000个活跃用户。
请告诉我您的想法 :)

1
我只会在极其糟糕的情况下使用FileSystemWatcher。如果你正在上传或复制文件,请写入消息队列,调用服务方法,或者采取其他措施,而不是等待FSW来接收它。 - Kieren Johnstone
你发现比 Graphics 更快的东西了吗?我也遇到了同样的问题。http://stackoverflow.com/questions/16988078/huge-fps-drop-when-picturebox-have-an-image-is-there-a-way-to-improve-the-fps - Pedro77
5个回答

7

我推荐使用ImageResizer

主要特点包括:

  • 基于RESTful的图片API(例如:src="img.jpg?w=170")
  • 直观地裁剪、调整大小、旋转、翻转、约束和编码
  • 将PDF渲染成图像
  • 19个免费插件涵盖了大多数常见任务
  • 磁盘+内存输入/输出缓存
  • 8位PNG/GIF和动画GIF处理
  • 灵活的文本和图像叠加支持
  • 图像过滤套件(需要许可证)
  • 高性能
  • 等等....

在Nuget上安装:

PM> Install-Package ImageResizer.MvcWebConfig
PM> Install-Package ImageResizer.Plugins.DiskCache
PM> Install-Package ImageResizer.Plugins.PrettyGifs

更多信息请查看: http://imageresizing.net/docs/install/nuget

(说明:该链接为IT技术相关内容,提供更详细的安装指南)

1
这是一条与ImageResizer.NET相关的注释。你在这里列出的DiskCache插件是性能包的一部分,如果你没有安装付费许可证(价格相当昂贵),它会在角落处显示一个小点。 - Scott Reed

7

这里是WinForms的方式。

public Image ResizeImage( Image img, int width, int height )
{
    Bitmap b = new Bitmap( width, height ) ;
    using(Graphics g = Graphics.FromImage( (Image ) b ))
    {       
         g.DrawImage( img, 0, 0, width, height ) ;
    }

    return (Image ) b ;
}

这里是WPF的方式 TransformedBitmap 类


4
建议使用 using 包装 Graphics 对象,而不是显式调用 Dispose。 - Turnor
你是对的,我编辑了帖子。 - Arsen Mkrtchyan
不,它和PictureBox缩放SizeMode一样慢。我正在寻找更快的方法;我的测试应用程序:http://stackoverflow.com/questions/16988078/huge-fps-drop-when-picturebox-have-an-image-is-there-a-way-to-improve-the-fps/16989547?noredirect=1#16989547 - Pedro77
@Turnor 为什么?因为蝴蝶效应,还是因为你这么说? - Kenneth K.
1
@KennethK. 因为即使抛出异常,它也会调用Dispose。 - Richard Szalay

7

有很多文章展示了 这个 的基础知识。我使用过 Atalasoft 的组件,发现它们的质量相当不错。调整大小和处理JPEG图像有微妙之处。

你似乎非常关注性能,但没有提供足够的信息来帮助我们为你建议良好的优化方法。无论你在做什么,都需要进行全面的性能分析并了解哪些部分运行较慢。在某些情况下,速度较慢但易于维护的图像处理代码可能是可以接受的,如果其他方面得到了优化。

一个好的性能解决方案是将需要转换的文件排队。添加更多机器以处理队列中的更多消息,或者优化服务代码以获得更高的吞吐量。如果设计得当,处理大量用户并不那么困难。


2
如果没有预算限制,LeadTools是传统的图像处理库。尽管如此,我的第一反应会是使用.NET GDI+调用进行编码,然后进行一些测试。很可能这个解决方案足够高效,但如果不行,你可以将其作为基准与其他库和解决方案进行比较。任何涉及生成命令行工具都需要为每个图像创建一个单独的进程,这可能会抵消使用非托管代码的好处。

0

我不确定性能如何,但开源OpenCV是一个选择。

void cvResize( const CvArr* I, CvArr* J, int interpolation=CV_INTER_LINEAR );

函数cvResize调整图像I的大小,使其恰好适合J。如果设置了ROI,则该函数像往常一样将ROI视为受支持的。使用指定的结构元素B来处理源图像,该元素确定取最小值的像素邻域的形状:


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接