Сделать квадратное изображение - PullRequest
11 голосов
/ 13 мая 2010

Как преобразовать изображение в квадрат, предпочтительно заполнение белым фоном в c # без использования сторонних библиотек (только .Net framework)?

Спасибо!

Ответы [ 3 ]

22 голосов
/ 13 мая 2010

На самом деле это можно сделать довольно легко.

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;
}
2 голосов
/ 13 мая 2010

Попробуйте использовать этот метод. Последний аргумент - это переключатель того, хотите ли вы растянуть изображение до нужного размера. Если 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 голос
/ 13 мая 2010

Вы не говорите, как вы хотите, чтобы оно было дополнено. Предполагая, что вы хотите центрировать изображение с именем файла изображения в 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...