2012-04-25 29 views
21

Estoy intentando cambiar el tamaño de las imágenes cargadas por el usuario a las dimensiones del paisaje, p. 450w y 250h mientras se mantiene la relación de aspecto, pero para evitar el cambio de tamaño de las imágenes, como las imágenes de retrato con lagunas en el lado, me gustaría recortar el centro de la imagen para llenar las dimensiones redimensionadas.Cambiar el tamaño de la imagen en C# con la relación de aspecto y la imagen central de recorte para que no haya lagunas

He encontrado un montón de código para cambiar el tamaño de las imágenes manteniendo la relación de aspecto pero no es lo que estoy buscando más arriba, espero que alguien pueda ayudar.

Respuesta

46

Debe pasar 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

Hay un problema con el tamaño de la imagen, recortada tamaño de la imagen es aproximadamente el doble del tamaño de imagen original. ¿Alguna solución? –

+0

Tuve el mismo problema sobre el tamaño del archivo de la nueva imagen recortada que es aproximadamente el mismo que el original. Un par de opciones funcionó para mí: cambiar PixelFormat a 32 bits por píxel menos costosos, establecer resoluciones horizontales y verticales a 72 (si se usa para web), finalmente, al guardar, asegúrese de especificar un formato de imagen como ImageFormat.jpeg – Swomble

+0

Su trabajo para mí, pero el único problema es que la imagen se acerca, por lo que no muestra toda la imagen. ¿cualquier sugerencia? –

Cuestiones relacionadas