我试图使用Bitmap.GetThumbnailImage()函数为文件夹中的20多个图像生成缩略图。当我执行以下过程时(在任务管理器内存中使用大约600,000K),我可以看到应用程序的巨大内存峰值。
foreach (var image in ListOfImages)
{
var thumbnailFolder = @"\thumb";
var thumbnailFile = thumbnailFolder + "\\" + image.Name;
if (!Directory.Exists(thumbnailFolder))
{
Directory.CreateDirectory(thumbnailFolder);
}
if (!File.Exists(thumbnailFile))
{
using (FileStream fs = new FileStream(image.FullName, FileMode.Open, FileAccess.Read))
{
Image origImage = Image.FromStream(fs);
var thumbnail = origImage.GetThumbnailImage(90, 120, null, IntPtr.Zero);
thumbnail.Save(thumbnailFile);
thumbnail.Dispose();
origImage.Dispose();
}
}
}
有没有办法减少缩略图生成的内存使用量?
答案 0 :(得分:2)
尝试使用WPF。
根据我的经验,WPF的图像操作得到了很好的优化(实际上它是正在使用的WIC库),并且在设计时考虑了线程,并且它不依赖于像GDI +那样的GDI位图处理。我读过一次,服务器代码不支持GDI +,因为它不是完全无泄漏的。对于您的方案,WPF不需要3D视频卡。
WPF的BitmapDecoder
甚至还具有内置的缩略图功能,如果可用,它将利用图像本身的缩略图。有关WPF中的基本图像任务,请参阅http://msdn.microsoft.com/en-us/library/ms750864(VS.85).aspx。要访问WPF,您需要引用WindowsBase程序集(.net 3.0或更高版本)。
答案 1 :(得分:1)
不要使用Image.FromStream,而是出于内存原因使用Image.FromFile。坦率地说,我认为出于质量原因你最好适应这个例子: