Sto tentando di ridimensionare le immagini in un processo batch. Quando uso le classi fornite da .Net, la memoria non viene rilasciata correttamente, quindi viene lanciata OutOfMemoryException. Penso di usare le istruzioni correttamente. Il codice è qui sotto:. Net Image ridimensionamento della perdita di memoria
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();
}
}
}
In alternativa a questo codice è possibile utilizzare la libreria di FreeImage. Quando utilizzo FreeImage, non c'è alcun problema di memoria. Codice con 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();
}
}
Cosa manca nel mio primo codice?
non si utilizza un utilizzo sulla bitmap .... anche voi volete mettere un utilizzo sulla grafica g troppo. –
Non hai gettato l'oggetto 'Graphics' (' var g = Graphics.FromImage (imgOut); ') –
o sull'oggetto' g' - un oggetto Graphics – SteveLove