填充或裁剪图像以在C#中实现方形尺寸

时间:2017-05-10 08:00:36

标签: c# .net

我的位图图像通常小于500x500像素。 但有时一个或两个维度可能超过500像素。 如果高度> 500,我想在底部裁剪图像,如果宽度> 500,我想在两侧均匀裁剪。 如果图像在任何维度上都<500,我想在每侧用白色像素填充它,使其达到500x500。 我不熟悉.NET,但我知道已经为你做了很多事情(我是C ++开发人员)。 我感谢任何帮助!谢谢!

这是我到目前为止所做的,它将图像置于白色500x500矩形图像的中心。只是我无法绕过原始图像的一维超过500像素的情况。 (参见(+)的两行)

??

2 个答案:

答案 0 :(得分:1)

这是我多次使用的旧方法

public static Image ThumbnailImage(Image sourceImage, int imageSize, bool maintainAspectRatio, bool maintainImageSize, Color backgroundColor)
        {
            try
            {

                int thumbnailWidth = imageSize;
                int thumbnailHeight = imageSize;

                if (maintainAspectRatio)
                {
                    float aspectRatio = (float) sourceImage.Width/sourceImage.Height;
                    float targetAspectRatio = (float) thumbnailWidth/thumbnailHeight;

                    if (aspectRatio < targetAspectRatio)
                    {
                        thumbnailWidth = (int) (thumbnailHeight*aspectRatio);
                    }
                    else if (aspectRatio > targetAspectRatio)
                    {
                        thumbnailHeight = (int) (thumbnailWidth/aspectRatio);
                    }
                }

                Image thumbnail = sourceImage.GetThumbnailImage(thumbnailWidth, thumbnailHeight, null, new IntPtr());

                if (maintainImageSize)
                {
                    var offset = new Point(0, 0);
                    if (thumbnailWidth != imageSize)
                    {
                        offset.X = ((imageSize - thumbnailWidth)/2);
                    }
                    if (thumbnailHeight != imageSize)
                    {
                        offset.Y = ((imageSize - thumbnailHeight)/2);
                    }

                    var bmpImage = new Bitmap(imageSize, imageSize, PixelFormat.Format32bppArgb);

                    using (Graphics graphics = Graphics.FromImage(bmpImage))
                    {
                        graphics.Clear(backgroundColor);
                        graphics.DrawImage(thumbnail, new Rectangle(offset.X, offset.Y, thumbnailWidth, thumbnailHeight), new Rectangle(0, 0, thumbnailWidth, thumbnailHeight), GraphicsUnit.Pixel);
                    }
                    thumbnail.Dispose();
                    return Image.FromHbitmap(bmpImage.GetHbitmap());
                }
                return thumbnail;
            }
            catch (Exception exception)
            {
                const string strExMsg = "Error Creating Thumbnail";
                throw new Exception(Assembly.GetExecutingAssembly().GetName().Name + " - " + strExMsg + " Msg : " + exception.Message);
            }

        }

答案 1 :(得分:1)

Bitmap PadCropImage(Bitmap original)
{
    if (original.Width == 500 && original.Height == 500)
        return original;

    if (original.Width > 500 && original.Height > 500)
    {
        int x = (original.Width - 500) / 2;
        int y = (original.Height - 500) / 2;
        return original.Clone(new Rectangle(x, y, 500, 500), original.PixelFormat);
    }

    Bitmap square = new Bitmap(500, 500);
    var g = Graphics.FromImage(square);

    if (original.Width > 500)
    {
        int x = (original.Width - 500) / 2;
        int y = (500 - original.Height) / 2;
        g.DrawImageUnscaled(original, -x, y);
    }
    else if (original.Height > 500)
    {
        int x = (500 - original.Width) / 2;
        int y = (original.Height - 500) / 2;
        g.DrawImageUnscaled(original, x, -y);
    }
    else
    {
        int x = (500 - original.Width) / 2;
        int y = (500 - original.Height) / 2;
        g.DrawImageUnscaled(original, x, y);
    }

    return square;
}