Подтвердить что ты не робот

Сделать квадратное изображение

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

Спасибо!

4b9b3361

Ответ 1

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

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

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

Ответ 3

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