我正在尝试在批处理作业中调整图像大小.当我使用.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图像调整内存泄漏大小


基础教程推荐
猜你喜欢
- C# – NetUseAdd来自Windows Server 2008和IIS7上的NetApi32.dll 2023-09-20
- C#集合查询Linq在项目中使用详解 2023-06-09
- c#中利用Tu Share获取股票交易信息 2023-03-03
- c#读取XML多级子节点 2022-11-05
- 使用c#从分隔文本文件中插入SQL Server表中的批量数据 2023-11-24
- C#中类与接口的区别讲解 2023-06-04
- Unity shader实现多光源漫反射以及阴影 2023-03-04
- C#通过GET/POST方式发送Http请求 2023-04-28
- 京东联盟C#接口测试示例分享 2022-12-02
- C# Winform实现石头剪刀布游戏 2023-01-11