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 ピクセル未満にすることはできないため、アスペクト比が他の正方形でない場合次元は高くなります。

この方法で私が見つけたのは、96px や 99px など、サイズの 1 つが 100px 未満になる場合があることです。これが起こらないようにするには、どうすればこのメソッドを変更できますか?

4

1 に答える 1

3

コードは不適切です。浮動小数点演算を使用してもポイントは得られません。浮動小数点演算には間違った方法で丸めるコツがあるため、100 ではなく 99 ピクセルで簡単に終了してしまう可能性があります。丸めを制御できるように、常に整数演算を優先してください。そして、寸法の 1 つが十分に大きく、最終的に 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 に答える