在.NET中生成缩略图的最快和更可靠的方法是什么?我需要获取任何图像,压缩JPEG并调整大小.
我看过几个GDI的例子,一些非免费的组件,我记得WPF有一些关于成像的好东西. GDI很旧,WPF的东西可能在服务器环境中没有任何好处.
这必须在一个完全信任的ASP.NET MVC应用程序中运行,如果可能,同步运行.
你会推荐什么
更新:
基于Mantorok’s answer我已经制定了这个例子,但它仍然是GDI,如果我尝试一个大图像,它会崩溃:
public void GenerateThumbnail(String filename,Int32? desiredWidth,Int32? desiredHeight,Int64 quality,Stream s) { using (Image image = Image.FromFile(filename)) { Int32 width=0,height=0; if ((!desiredHeight.HasValue && !desiredWidth.HasValue) || (desiredHeight.HasValue && desiredWidth.HasValue)) throw new ArgumentException( "You have to specify a desired width OR a desired height"); if (desiredHeight.HasValue) { width = (desiredHeight.Value * image.Width) / image.Height; height = desiredHeight.Value; } else { height = (desiredWidth.Value * image.Height) / image.Width; width = desiredWidth.Value; } using (var newImage = new Bitmap(width,height)) using (var graphics = Graphics.FromImage(newImage)) using (EncoderParameter qualityParam = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality,quality)) using (EncoderParameters encoderParams = new EncoderParameters(1)) { graphics.DrawImage(image,width,height); ImageCodecInfo jpegCodec = ImageCodecInfo.GetImageEncoders(). Single(e => e.MimeType.Equals("image/jpeg",StringComparison.Ordinal)); encoderParams.Param[0] = qualityParam; newImage.Save(s,jpegCodec,encoderParams); } } }
解决方法
对于密集的服务器端代码,我建议您使用除GDI之外的其他技术,GDI尚未设计为通过块(以流式传输方式)处理图像块.
您可以使用Windows Imaging Component 或WPF进行此任务.这里有一个非常好的例子,说明如何快速,更重要 – 可扩展的方式来做到这一点:
The fastest way to resize images from ASP.NET. And it’s (more) supported-ish.