2010-02-03 33 views

Respuesta

8

la escala de una imagen en un cuadro de imagen:

class ImageHandling 
{ 
    public static Rectangle GetScaledRectangle(Image img, Rectangle thumbRect) 
    { 
     if (img.Width < thumbRect.Width && img.Height < thumbRect.Height) 
      return new Rectangle(thumbRect.X + ((thumbRect.Width - img.Width)/2), thumbRect.Y + ((thumbRect.Height - img.Height)/2), img.Width, img.Height); 

     int sourceWidth = img.Width; 
     int sourceHeight = img.Height; 

     float nPercent = 0; 
     float nPercentW = 0; 
     float nPercentH = 0; 

     nPercentW = ((float)thumbRect.Width/(float)sourceWidth); 
     nPercentH = ((float)thumbRect.Height/(float)sourceHeight); 

     if (nPercentH < nPercentW) 
      nPercent = nPercentH; 
     else 
      nPercent = nPercentW; 

     int destWidth = (int)(sourceWidth * nPercent); 
     int destHeight = (int)(sourceHeight * nPercent); 

     if (destWidth.Equals(0)) 
      destWidth = 1; 
     if (destHeight.Equals(0)) 
      destHeight = 1; 

     Rectangle retRect = new Rectangle(thumbRect.X, thumbRect.Y, destWidth, destHeight); 

     if (retRect.Height < thumbRect.Height) 
      retRect.Y = retRect.Y + Convert.ToInt32(((float)thumbRect.Height - (float)retRect.Height)/(float)2); 

     if (retRect.Width < thumbRect.Width) 
      retRect.X = retRect.X + Convert.ToInt32(((float)thumbRect.Width - (float)retRect.Width)/(float)2); 

     return retRect; 
    } 

    public static Image GetResizedImage(Image img, Rectangle rect) 
    { 
     Bitmap b = new Bitmap(rect.Width, rect.Height); 
     Graphics g = Graphics.FromImage((Image)b); 
     g.InterpolationMode = InterpolationMode.HighQualityBicubic; 
     g.DrawImage(img, 0, 0, rect.Width, rect.Height); 
     g.Dispose(); 

     try 
     { 
      return (Image)b.Clone(); 
     } 
     finally 
     { 
      b.Dispose(); 
      b = null; 
      g = null; 
     } 
    } 
} 

Y cómo usarlo:

Image img = Image.FromFile(imageFilePath); 
Rectangle newRect = GetScaledRectangle(img, pictureBox1.ClientRectangle); 
pictureBox1.Image = ImageHandling.GetResizedImage(img, newRect); 
+0

Lo siento, pero lo soluciona este método? Además del estrecho acoplamiento a la clase de imagen, esto no cambia el tamaño de una imagen, simplemente proporciona una forma de calcular cómo mantener la relación de aspecto al cambiar el tamaño a ancho y alto definidos (tumbRect). –

+0

Estoy usando esto para escalar correctamente las imágenes que se muestran en una caja de imágenes de tamaño fijo, sin tocar el archivo original. – Amirshk

+0

Está bien, aún así, el cambio de tamaño real ocurre en 'ImageHandler.GetResizeImage' que supongo que es una clase de utilidad de usted mismo. –

0

sacle y el centro de un ImageBox:

private void LoadAndResizeImage(string sImagepath, int iMaxHeight, int iMaxWidth, int iMinX, int iMinY) 
{ 
    int wdt = iMaxWidth; 
    int hgt = iMaxHeight; 
    int partialX = iMinX; 
    int partialY = iMinY; 

    pictureBox1.ImageLocation = sImagepath; 
    if ((pictureBox1.Image.Height > iMaxHeight) || (pictureBox1.Image.Width > iMaxWidth)) 
    { 
     if ((pictureBox1.Image.Width/iMaxWidth) > (pictureBox1.Image.Height/iMaxHeight)) 
     { 
      wdt = iMaxWidth; 
      double ratio = (double)pictureBox1.Image.Height/(double)pictureBox1.Image.Width; 
      hgt = (int)(iMaxWidth * ratio); 
     } 
     else 
     { 
      hgt = iMaxHeight; 
      double ratio = (double)pictureBox1.Image.Width/(double)pictureBox1.Image.Height; 
      wdt = (int)(iMaxHeight * ratio); 
     } 
    } 
    else 
    { 
     hgt = pictureBox1.Image.Height; 
     wdt = pictureBox1.Image.Width; 
    } 
    if (wdt < iMaxWidth) 
    { 
     partialX = (iMaxWidth - wdt)/2; 
     partialX += iMinX; 
    } 
    else 
    { 
     partialX = iMinX; 
    } 
    if (hgt < iMaxHeight) 
    { 
     partialY = (iMaxHeight - hgt)/2; 
     partialY += iMinY; 
    } 
    else 
    { 
     partialY = iMinY; 
    } 


    //Set size 
    pictureBox1.Height = hgt; 
    pictureBox1.Width = wdt; 
    pictureBox1.Left = partialX; 
    pictureBox1.Top = partialY; 
} 
Cuestiones relacionadas