制作方形图像

如何将图像重新取样为方形,在c#中使用白色背景填充而不使用任何第三方库(仅限.Net框架)?

谢谢!

这实际上可以很容易地完成。

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; } 

尝试使用此方法。 最后一个参数是用于是否要拉伸图像以适合的开关。 如果为false,则图像在新白色canvas内居中。 您可以根据需要将方形或非方形大小传递给它。

  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; } 

你没有说你想要它如何填充。 假设您希望图像居中,imageFileName中的图像文件名和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);