Tôi đang cố định lại kích thước hình ảnh trong một tác vụ hàng loạt. Khi tôi sử dụng các lớp .Net được cung cấp, bộ nhớ không được phát hành đúng cách để OutOfMemoryException được ném ra. Tôi nghĩ tôi sử dụng câu lệnh đúng cách. Mã bên dưới:. Rò rỉ bộ nhớ thay đổi kích thước hình ảnh Net
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();
}
}
}
Thay thế cho mã này là sử dụng thư viện FreeImage. Khi tôi sử dụng FreeImage, không có vấn đề về bộ nhớ. Mã với 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();
}
}
Điều gì bị thiếu trong mã đầu tiên của tôi?
Bạn không sử dụng Sử dụng trên Bitmap .... bạn cũng muốn đặt một Sử dụng trên Graphics g quá. –
Bạn không bỏ đối tượng 'Graphics' (' var g = Graphics.FromImage (imgOut); ') –
hoặc trên đối tượng' g' - đối tượng Đồ họa – SteveLove