2

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

     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;
    }

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

我用这种方法发现有时其中一个尺寸会低于 100 像素 - 例如 96 像素或 99 像素。如何更改此方法以确保不会发生这种情况?

4

1 回答 1

3

该代码是不合适的。它不会因使用浮点数学而得分,它具有以错误方式舍入的诀窍,因此您可以轻松地以 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 语句。

于 2013-04-14T11:45:42.457 回答