2010-05-12 66 views
11

如何在不使用任何第三方庫(僅限.Net框架)的情況下將圖像重新採樣爲方形,在c#中使用白色背景進行填充?製作方形圖像

謝謝!

+1

你想新重新採樣的圖像放入一個正方形白色帆布,使得圖像保留其長寬比或拉伸,以適應方形(使白色帆布那種不必要的)? – JYelton 2010-05-12 23:35:31

+0

我想保留長寬比 - 沒有拉伸 – 2010-05-13 00:15:12

+0

@ MichaelD.aren't那些不相容?平方改變寬高比。或者是裁剪圖像可以接受? – kenny 2015-06-29 21:00:33

回答

21

這實際上可以很容易地完成。

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

我知道這是一箇舊帖子,但它仍然有用。我實際上使用Math.Min裁剪我的圖像來獲取縮略圖。完美的作品! – AntLaC 2017-08-27 11:55:30

2

請嘗試使用此方法。最後一個參數是一個開關,用於確定是否要拉伸圖像以適合。如果爲false,則圖像將位於新白色畫布的中央。您可以根據需要將正方形或非正方形大小傳遞給它。

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

你不說你想如何填充。假設你想要的形象爲中心,在映像文件名稱的圖像文件名和所需的輸出文件名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);