2012-04-25 20 views
21

Sto provando a ridimensionare le immagini caricate dall'utente su una dimensione orizzontale, ad es. 450w e 250h pur mantenendo le proporzioni, ma per evitare di ridimensionare le immagini come quelle del ritratto con spazi sul lato, vorrei ritagliare il centro dell'immagine per riempire le dimensioni ridimensionate.Ridimensionare l'immagine in C# con proporzioni e ritagliare l'immagine centrale in modo da non lasciare spazi vuoti

Ho trovato un sacco di codice per ridimensionare le immagini mantenendo le proporzioni ma non quello che sto cercando sopra, spero che qualcuno possa aiutare.

risposta

46

Si dovrebbe passare needToFill = true:

public static System.Drawing.Image FixedSize(Image image, int Width, int Height, bool needToFill) 
     { 
      #region calculations 
      int sourceWidth = image.Width; 
      int sourceHeight = image.Height; 
      int sourceX = 0; 
      int sourceY = 0; 
      double destX = 0; 
      double destY = 0; 

      double nScale = 0; 
      double nScaleW = 0; 
      double nScaleH = 0; 

      nScaleW = ((double)Width/(double)sourceWidth); 
      nScaleH = ((double)Height/(double)sourceHeight); 
      if (!needToFill) 
      { 
       nScale = Math.Min(nScaleH, nScaleW); 
      } 
      else 
      { 
       nScale = Math.Max(nScaleH, nScaleW); 
       destY = (Height - sourceHeight * nScale)/2; 
       destX = (Width - sourceWidth * nScale)/2; 
      } 

      if (nScale > 1) 
       nScale = 1; 

      int destWidth = (int)Math.Round(sourceWidth * nScale); 
      int destHeight = (int)Math.Round(sourceHeight * nScale); 
      #endregion 

      System.Drawing.Bitmap bmPhoto = null; 
      try 
      { 
       bmPhoto = new System.Drawing.Bitmap(destWidth + (int)Math.Round(2 * destX), destHeight + (int)Math.Round(2 * destY)); 
      } 
      catch (Exception ex) 
      { 
       throw new ApplicationException(string.Format("destWidth:{0}, destX:{1}, destHeight:{2}, desxtY:{3}, Width:{4}, Height:{5}", 
        destWidth, destX, destHeight, destY, Width, Height), ex); 
      } 
      using (System.Drawing.Graphics grPhoto = System.Drawing.Graphics.FromImage(bmPhoto)) 
      { 
       grPhoto.InterpolationMode = InterpolationMode.HighQualityBicubic; 
       grPhoto.CompositingQuality = CompositingQuality.HighQuality; 
       grPhoto.SmoothingMode = SmoothingMode.HighQuality; 

       Rectangle to = new System.Drawing.Rectangle((int)Math.Round(destX), (int)Math.Round(destY), destWidth, destHeight); 
       Rectangle from = new System.Drawing.Rectangle(sourceX, sourceY, sourceWidth, sourceHeight); 
       //Console.WriteLine("From: " + from.ToString()); 
       //Console.WriteLine("To: " + to.ToString()); 
       grPhoto.DrawImage(image, to, from, System.Drawing.GraphicsUnit.Pixel); 

       return bmPhoto; 
      } 
     } 
+0

C'è un problema con la dimensione dell'immagine, ritagliata dimensione dell'immagine è circa due volte più grande come immagine originale. Qualche correzione? –

+0

Ho avuto lo stesso problema con la dimensione della nuova immagine ritagliata che è all'incirca uguale all'originale. Un paio di opzioni ha funzionato per me: cambia PixelFormat in un meno costoso 32 bit per pixel, imposta risoluzioni orizzontali e verticali a 72 (se utilizzi per il web), infine al salvataggio assicurati di specificare un formato immagine proprio come ImageFormat.jpeg – Swomble

+0

Il suo lavoro per me, ma solo il problema è l'immagine ottiene lo zoom in modo che non visualizza l'intera immagine. qualche suggerimento? –

Problemi correlati