我正在尝试在批处理作业中调整图像大小.当我使用.Net提供的类时,内存未正确释放,因此抛出OutOfMemoryException.我想我正确地使用了陈述.代码如下:private static byte[] Resize(byte[] imageBytes, int width, int ...
                
我正在尝试在批处理作业中调整图像大小.当我使用.Net提供的类时,内存未正确释放,因此抛出OutOfMemoryException.我想我正确地使用了陈述.代码如下:
    private static byte[] Resize(byte[] imageBytes, int width, int height)
    {
            using (var img = Image.FromStream(new MemoryStream(imageBytes)))
            {
                using (var outStream = new MemoryStream())
                {
                    double y = img.Height;
                    double x = img.Width;
                    double factor = 1;
                    if (width > 0)
                        factor = width / x;
                    else if (height > 0)
                        factor = height / y;
                    var imgOut = new Bitmap((int)(x * factor), (int)(y * factor));
                    var g = Graphics.FromImage(imgOut);
                    g.Clear(Color.White);
                    g.DrawImage(img, new Rectangle(0, 0, (int)(factor * x),
                                                   (int)(factor * y)),
                                new Rectangle(0, 0, (int)x, (int)y), GraphicsUnit.Pixel);
                    imgOut.Save(outStream, ImageFormat.Jpeg);
                    return outStream.ToArray();
                }
            }
      }
此代码的替代方法是使用FreeImage库.当我使用FreeImage时,没有内存问题. FreeImage代码:
   private static byte[] Resize(byte[] imageBytes, int width, int height)
   {
        var img = new FIBITMAP();
        var rescaled = new FIBITMAP();
        try
        {
            using (var inStream = new MemoryStream(imageBytes))
            {
                img = FreeImage.LoadFromStream(inStream);
                rescaled = FreeImage.Rescale(img, width, height, FREE_IMAGE_FILTER.FILTER_BICUBIC);
                using (var outStream = new MemoryStream())
                {
                    FreeImage.SaveToStream(rescaled, outStream, FREE_IMAGE_FORMAT.FIF_JPEG);
                    return outStream.ToArray();
                }
            }
        }
        finally
        {
            if (!img.IsNull)
                FreeImage.Unload(img);
            img.SetNull();
            if (!rescaled.IsNull)
                FreeImage.Unload(rescaled);
            rescaled.SetNull();
        }
   }
我的第一个代码中缺少什么?
解决方法:
我相信你的泄漏是以下两行:
var imgOut = new Bitmap((int)(x * factor), (int)(y * factor));
var g = Graphics.FromImage(imgOut);
Bitmap和Graphics都实现了IDisposable,因此应该在使用完毕后进行处理.
我建议将它们包装在一个使用块中:
using(imgOut = new Bitmap((int)(x * factor), (int)(y * factor)))
{
    using(var g = Graphics.FromImage(imgOut))
    {
        //rest of code...
    }
}
Here is a list of GDI objects要注意,如果你使用它们,请确保你正确清理它们.
				 沃梦达教程
				
			本文标题为:c# – .Net图像调整内存泄漏大小
				
        
 
            
        
             猜你喜欢
        
	     - WPF使用DrawingContext实现绘制刻度条 2023-07-04
 - user32.dll 函数说明小结 2022-12-26
 - 在C# 8中如何使用默认接口方法详解 2023-03-29
 - C# 使用Aspose.Cells 导出Excel的步骤及问题记录 2023-05-16
 - Unity Shader实现模糊效果 2023-04-27
 - 如何使用C# 捕获进程输出 2023-03-10
 - Unity3D实现渐变颜色效果 2023-01-16
 - Oracle中for循环的使用方法 2023-07-04
 - c# 模拟线性回归的示例 2023-03-14
 - .NET CORE DI 依赖注入 2023-09-27
 
						
						
						
						
						
				
				
				
				