2010-05-12 45 views
11

Cách lấy lại mẫu hình ảnh thành hình vuông, đệm với nền trắng trong C# thích hợp hơn mà không sử dụng bất kỳ thư viện nào của bên thứ ba (chỉ .Net framework)?Làm cho hình ảnh vuông

Cảm ơn!

+1

Bạn có muốn vừa với vừa được lấy lại hình ảnh thành hình vuông với canvas trắng sao cho hình ảnh giữ nguyên tỷ lệ khung hình hay kéo dài để vừa với hình vuông (làm loại canvas trắng không cần thiết)? – JYelton

+0

tôi muốn giữ nguyên tỉ lệ khung hình - không kéo dài –

+0

@ MichaelD.không phải là không tương thích? Squaring thay đổi tỉ lệ khung hình. Hoặc là cắt hình ảnh chấp nhận được? – kenny

Trả lời

21

Điều này thực sự có thể được thực hiện khá dễ dàng.

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

Tôi biết đây là một bài đăng cũ nhưng nó vẫn hữu ích. Tôi thực sự đã sử dụng Math.Min để cắt hình ảnh của mình để có hình thu nhỏ. Hoạt động hoàn hảo! – AntLaC

2

Thử sử dụng phương pháp này. Đối số cuối cùng là một chuyển đổi cho dù bạn muốn kéo giãn hình ảnh cho vừa. Nếu sai, hình ảnh được căn giữa bên trong canvas trắng mới. Bạn có thể vượt qua một kích thước vuông hoặc không vuông cho nó khi cần thiết.

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

Bạn không nói cách bạn muốn đệm. Giả sử bạn muốn hình ảnh được căn giữa, với tên tệp hình ảnh trong imageFileName và tên tệp đầu ra mong muốn trong 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); 
Các vấn đề liên quan