2010-05-12 9 views
11

Comment rééchantillonner une image en carré, un remplissage avec un fond blanc en C# est préférable sans utiliser de bibliothèque tierce (framework .Net uniquement)?Faire une image carrée

Merci!

+1

Voulez-vous adapter à la nouvelle image rééchantillonnée dans un carré avec une toile blanche que l'image conserve son rapport d'aspect, ou d'étirer pour l'adapter à la place (faisant la toile blanche de type inutile)? – JYelton

+0

je veux conserver le rapport d'aspect - pas d'étirement –

+0

@ MichaelD.aren't ceux incompatibles? La quadrature modifie le rapport d'aspect. Ou est-ce que l'écrêtage de l'image est acceptable? – kenny

Répondre

21

Cela peut effectivement être fait assez facilement.

public static Image PadImage(Image originalImage) 
{ 
    int largestDimension = Math.Max(originalImage.Height, originalImage.Width); 
    Size squareSize = new Size(largestDimension, largestDimension); 
    Bitmap squareImage = new Bitmap(squareSize.Width, squareSize.Height); 
    using (Graphics graphics = Graphics.FromImage(squareImage)) 
    { 
     graphics.FillRectangle(Brushes.White, 0, 0, squareSize.Width, squareSize.Height); 
     graphics.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality; 
     graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; 
     graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; 

     graphics.DrawImage(originalImage, (squareSize.Width/2) - (originalImage.Width/2), (squareSize.Height/2) - (originalImage.Height/2), originalImage.Width, originalImage.Height); 
    } 
    return squareImage; 
} 
+0

Je sais que c'est un vieux post, mais c'est toujours utile. J'ai utilisé le Math.Min pour recadrer mes images afin d'obtenir une vignette. Fonctionne parfaitement! – AntLaC

2

Essayez d'utiliser cette méthode. Le dernier argument est un commutateur pour savoir si vous souhaitez étirer l'image pour s'adapter. Si faux, l'image est centrée dans la nouvelle toile blanche. Vous pouvez lui donner une taille carrée ou non car nécessaire.

public static Bitmap ResizeBitmapOnWhiteCanvas(Bitmap bmpOriginal, Size szTarget, bool Stretch) 
    { 
     Bitmap result = new Bitmap(szTarget.Width, szTarget.Height); 
     using (Graphics g = Graphics.FromImage((Image)result)) 
     { 
      g.InterpolationMode = InterpolationMode.NearestNeighbor; 
      g.FillRectangle(Brushes.White, new Rectangle(0, 0, szTarget.Width, szTarget.Height)); 
      if (Stretch) 
      { 
       g.DrawImage(bmpOriginal, 0, 0, szTarget.Width, szTarget.Height); // fills the square (stretch) 
      } 
      else 
      { 
       float OriginalAR = bmpOriginal.Width/bmpOriginal.Height; 
       float TargetAR = szTarget.Width/szTarget.Height; 
       if (OriginalAR >= TargetAR) 
       { 
        // Original is wider than target 
        float X = 0F; 
        float Y = ((float)szTarget.Height/2F) - ((float)szTarget.Width/(float)bmpOriginal.Width * (float)bmpOriginal.Height)/2F; 
        float Width = szTarget.Width; 
        float Height = (float)szTarget.Width/(float)bmpOriginal.Width * (float)bmpOriginal.Height; 
        g.DrawImage(bmpOriginal, X, Y, Width, Height); 
       } 
       else 
       { 
        // Original is narrower than target 
        float X = ((float)szTarget.Width/2F) - ((float)szTarget.Height/(float)bmpOriginal.Height * (float)bmpOriginal.Width)/2F; 
        float Y = 0F; 
        float Width = (float)szTarget.Height/(float)bmpOriginal.Height * (float)bmpOriginal.Width; 
        float Height = szTarget.Height; 
        g.DrawImage(bmpOriginal, X, Y, Width, Height); 
       } 
      } 
     } 
     return result; 
    } 
1

Vous ne dites pas comment vous voulez rembourré. En supposant que vous voulez que l'image centrée, avec le nom du fichier image dans ImageFileName et le nom du fichier de sortie souhaité dans NewFileName:

 Bitmap orig = new Bitmap(imageFileName); 
     int dim = Math.Max(orig.Width, orig.Height); 
     Bitmap dest; 
     using (Graphics origG = Graphics.FromImage(orig)) 
     { 
      dest = new Bitmap(dim, dim, origG); 
     } 
     using (Graphics g = Graphics.FromImage(dest)) 
     { 
      Pen white = new Pen(Color.White, 22); 
      g.FillRectangle(new SolidBrush(Color.White), 0, 0, dim, dim); 
      g.DrawImage(orig, new Point((dim - orig.Width)/2, (dim - orig.Height)/2)); 
     } 
     dest.Save(newFileName); 
Questions connexes