Ridimensionamento di un System.Drawing.Bitmap a una determinata dimensione mantenendo le proporzioni

Voglio ridimensionare un System.Drawing.Bitmap almeno ad una larghezza e un’altezza fisse. Questo è quello di generare miniature per una galleria di immagini su un sito Web, quindi voglio mantenere le proporzioni allo stesso modo.

Ho alcune soluzioni diverse ma nessuna sembra davvero fare ciò di cui ho bisogno; ruotano attorno al ridimensionamento basato sul mantenere la larghezza o l’altezza lo stesso, ma non cambiano entrambi.

Un esempio:

Se ho un’immagine 4272 per 2848 e voglio ridimensionarla a una dimensione di 1024 per 768, l’immagine risultante dovrebbe essere 1024 per 683 e riempita (con un bordo nero) a 1024 per 768.

Come posso fare questo con immagini più grandi della dimensione richiesta e più piccole rispetto alla dimensione richiesta e anche immagini di pad che non escono alla dimensione esatta di cui ho bisogno una volta ridimensionate?

Parametri target:

 float width = 1024; float height = 768; var brush = new SolidBrush(Color.Black); 

Il tuo file originale:

 var image = new Bitmap(file); 

Dimensionamento target (fattore di scala):

 float scale = Math.Min(width / image.Width, height / image.Height); 

Il ridimensionamento includendo prima la canvas per spazzolatura:

 var bmp = new Bitmap((int)width, (int)height); var graph = Graphics.FromImage(bmp); // uncomment for higher quality output //graph.InterpolationMode = InterpolationMode.High; //graph.CompositingQuality = CompositingQuality.HighQuality; //graph.SmoothingMode = SmoothingMode.AntiAlias; var scaleWidth = (int)(image.Width * scale); var scaleHeight = (int)(image.Height * scale); graph.FillRectangle(brush, new RectangleF(0, 0, width, height)); graph.DrawImage(image, ((int)width - scaleWidth)/2, ((int)height - scaleHeight)/2, scaleWidth, scaleHeight); 

E non dimenticare di fare un bmp.Save(filename) per salvare il file risultante.

Il costruttore di bitmap ha il ridimensionamento integrato.

 Bitmap original = (Bitmap)Image.FromFile("DSC_0002.jpg"); Bitmap resized = new Bitmap(original,new Size(original.Width/4,original.Height/4)); resized.Save("DSC_0002_thumb.jpg"); 

http://sofit.miximages.com/c%23/ngMode.AntiAlias; graph.FillRectangle(brush, new RectangleF(0, 0, width, height)); graph.DrawImage(rawImage, new Rectangle(0, 0 , scaleWidth, scaleHeight)); scaledBitmap.Save(fileName, ImageFormat.Png); return scaledBitmap; }