在C#中调整图像大小

时间:2013-04-14 10:59:59

标签: c# resize gdi

我在网上找到了以下方法,它将图像大小调整为近似大小,同时保持宽高比。

     public Image ResizeImage(Size size)
    {
        int sourceWidth = _Image.Width;
        int sourceHeight = _Image.Height;

        float nPercent = 0;
        float nPercentW = 0;
        float nPercentH = 0;

        nPercentW = ((float)size.Width / (float)sourceWidth);
        nPercentH = ((float)size.Height / (float)sourceHeight);

        if (nPercentH > nPercentW)
            nPercent = nPercentH;
        else
            nPercent = nPercentW;

        int destWidth = (int)(sourceWidth * nPercent);
        int destHeight = (int)(sourceHeight * nPercent);

        Bitmap b = new Bitmap(destWidth, destHeight);
        Graphics g = Graphics.FromImage((Image)b);
        g.InterpolationMode = InterpolationMode.HighQualityBicubic;

        g.DrawImage(_Image, 0, 0, destWidth, destHeight);
        g.Dispose();

        return (Image)b;
    }

我通常传入宽度为100px,高度为100px的尺寸 - 作为我的要求的一部分,我不能有任何单一尺寸(高度或宽度)低于100px,所以如果宽高比不是正方形的另一个维度会更高。

我发现这种方法偶尔会有一个尺寸低于100px - 例如96px或99px。如何更改此方法以确保不会发生这种情况?

1 个答案:

答案 0 :(得分:2)

代码不合适。它没有使用浮点数学得分,它有一个迂回错误方法的诀窍,所以你很容易得到99像素而不是100。总是喜欢整数数学所以你可以控制舍入。它只是没有做任何事情来确保其中一个尺寸足够大,最终得到96像素的方式。只需编写更好的代码。像:

    public static Image ResizeImage(Image img, int minsize) {
        var size = img.Size;
        if (size.Width >= size.Height) {
            // Could be: if (size.Height < minsize) size.Height = minsize;
            size.Height = minsize;
            size.Width = (size.Height * img.Width + img.Height - 1) / img.Height;
        }
        else {
            size.Width = minsize;
            size.Height = (size.Width * img.Height + img.Width - 1) / img.Width;
        }
        return new Bitmap(img, size);
    }

如果您只想确保图片足够大并接受更大的图片,我会留下评论以显示您的操作。从问题中不清楚。如果是这种情况,那么也要在else子句中复制if语句。