Ho ottenuto alcuni disegni di costruzione molto grandi, a volte 22466x3999 con una profondità di bit di 24 o anche maggiore. Devo essere in grado di ridimensionarle a versioni più piccole e di essere in grado di ritagliare sezioni dell'immagine in immagini più piccole.C# Ritaglia e ridimensiona le immagini di grandi dimensioni
Sono stato con il seguente codice per ridimensionare le immagini, che ho trovato here:
public static void ResizeImage(string OriginalFile, string NewFile, int NewWidth, int MaxHeight, bool OnlyResizeIfWider)
{
System.Drawing.Image FullsizeImage = System.Drawing.Image.FromFile(OriginalFile);
if (OnlyResizeIfWider)
{
if (FullsizeImage.Width <= NewWidth)
{
NewWidth = FullsizeImage.Width;
}
}
int NewHeight = FullsizeImage.Height * NewWidth/FullsizeImage.Width;
if (NewHeight > MaxHeight)
{
NewWidth = FullsizeImage.Width * MaxHeight/FullsizeImage.Height;
NewHeight = MaxHeight;
}
System.Drawing.Image NewImage = FullsizeImage.GetThumbnailImage(NewWidth, NewHeight, null, IntPtr.Zero);
FullsizeImage.Dispose();
NewImage.Save(NewFile);
}
E questo codice per ritagliare le immagini:
public static MemoryStream CropToStream(string path, int x, int y, int width, int height)
{
if (string.IsNullOrWhiteSpace(path)) return null;
Rectangle fromRectangle = new Rectangle(x, y, width, height);
using (Image image = Image.FromFile(path, true))
{
Bitmap target = new Bitmap(fromRectangle.Width, fromRectangle.Height);
using (Graphics g = Graphics.FromImage(target))
{
Rectangle croppedImageDimentions = new Rectangle(0, 0, target.Width, target.Height);
g.DrawImage(image, croppedImageDimentions, fromRectangle, GraphicsUnit.Pixel);
}
MemoryStream stream = new MemoryStream();
target.Save(stream, image.RawFormat);
stream.Position = 0;
return stream;
}
}
Il mio problema è che ho un Sytem.OutOfMemoryException quando provo a ridimensionare l'immagine, ed è perché non riesco a caricare l'immagine completa in FullsizeImage.
Quindi, cosa mi piacerebbe sapere, come ridimensionare un'immagine senza caricare l'intera immagine in memoria?
Questa non è una soluzione di programmazione, ma si potrebbe provare ad aumentare la memoria * virtual * dimensioni della vostra macchina e vedi. – Kurubaran
Si dovrebbe lavorare con LockBits per tali dimensioni di immagine – Vajura
@Kurubaran Ho provato ad aumentare la dimensione della memoria, che non ha funzionato, e non penso che sia la soluzione corretta per un webproject. –