gpt4 book ai didi

c# - .Net 图像调整大小内存泄漏

转载 作者:太空狗 更新时间:2023-10-29 23:15:36 25 4
gpt4 key购买 nike

我正在尝试在批处理作业中调整图像大小。当我使用 .Net 提供的类时,内存未正确释放,因此抛出 OutOfMemoryException。我想我正确地使用了 using 语句。代码如下:

    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);

BitmapGraphics 都实现了 IDisposable,因此在您使用完它们后应该将其丢弃。

我建议将它们都包装在 using block 中:

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 图像调整大小内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17806914/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com