我正嘗試調整批處理作業中的圖像大小。當我使用.Net提供的類時,內存未正確釋放,因此引發OutOfMemoryException。我想我正確地使用了陳述。代碼如下:.net Image調整內存泄漏大小
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();
}
}
缺什麼在我的第一個代碼?
您使用的不是使用位圖上的....你也想提出一個使用的圖形摹過。 –
你沒有處理'Graphics'對象('var g = Graphics.FromImage(imgOut);') –
或'g'對象 - 一個Graphics對象 – SteveLove