web-dev-qa-db-ja.com

アスペクト比を維持しながら、System.Drawing.Bitmapを特定のサイズにスケーリングする

System.Drawing.Bitmapを少なくとも一定の幅と高さよりも小さくする必要があります。これは、Webサイト上の画像ギャラリーのサムネイルを生成するためです。そのため、アスペクト比を同じに保ちたいと思います。

私はかなりの数のソリューションをいくつか持っていますが、私が必要とすることを実際に行うものはありません。幅または高さを同じに保ちながら、両方を変更しないことに基づいて、スケーリングを中心に展開します。

例:

4848 x 2848の画像があり、それを1024 x 768のサイズにスケーリングしたい場合、結果の画像は1024 x 683になり、(黒い境界線で)1024 x 768にパディングされます。

必要なサイズよりも大きく、必要なサイズよりも小さい画像で、これを行うにはどうすればいいですか?また、一度スケーリングすると必要な正確なサイズにならない画像もパッドしますか?

50
Michael J. Gray

ターゲットパラメータ:

_float width = 1024;
float height = 768;
var brush = new SolidBrush(Color.Black);
_

元のファイル:

_var image = new Bitmap(file);
_

ターゲットのサイズ設定(スケール係数):

_float scale = Math.Min(width / image.Width, height / image.Height);
_

最初にキャンバスのブラッシングを含むサイズ変更:

_var bmp = new Bitmap((int)width, (int)height);
var graph = Graphics.FromImage(bmp);

// uncomment for higher quality output
//graph.InterpolationMode = InterpolationMode.High;
//graph.CompositingQuality = CompositingQuality.HighQuality;
//graph.SmoothingMode = SmoothingMode.AntiAlias;

var scaleWidth = (int)(image.Width * scale);
var scaleHeight = (int)(image.Height * scale);

graph.FillRectangle(brush, new RectangleF(0, 0, width, height));
graph.DrawImage(image, ((int)width - scaleWidth)/2, ((int)height - scaleHeight)/2, scaleWidth, scaleHeight);
_

bmp.Save(filename)を実行して、結果のファイルを保存することを忘れないでください。

53
yamen

ビットマップコンストラクターには、サイズ変更が組み込まれています。

Bitmap original = (Bitmap)Image.FromFile("DSC_0002.jpg");
Bitmap resized = new Bitmap(original,new Size(original.Width/4,original.Height/4));
resized.Save("DSC_0002_thumb.jpg");

http://msdn.Microsoft.com/en-us/library/0wh0045z.aspx

補間モードを制御したい場合は、 this post をご覧ください。

136
WHol

Yamenの答えに追加するだけです。これは画像には最適ですが、テキストにはあまり適していません。これを使用してテキストをスケーリングしようとしている場合は、Word文書(この場合はWord相互運用機能からのバイト数)のように、いくつかの変更を行うか、横に巨大なバーが表示されます。完璧ではないかもしれませんが、私にはうまくいきます!

using (MemoryStream ms = new MemoryStream(wordBytes))
                {
                    float width = 3840;
                    float height = 2160;

                    var brush = new SolidBrush(Color.White);
                    var rawImage = Image.FromStream(ms);
                    float scale = Math.Min(width / rawImage.Width, height / rawImage.Height);
                    var scaleWidth = (int)(rawImage.Width * scale);
                    var scaleHeight = (int)(rawImage.Height * scale);
                    var scaledBitmap = new Bitmap(scaleWidth, scaleHeight);
                    Graphics graph = Graphics.FromImage(scaledBitmap);
                    graph.InterpolationMode = InterpolationMode.High;
                    graph.CompositingQuality = CompositingQuality.HighQuality;
                    graph.SmoothingMode = SmoothingMode.AntiAlias;
                    graph.FillRectangle(brush, new RectangleF(0, 0, width, height));
                    graph.DrawImage(rawImage, new Rectangle(0, 0 , scaleWidth, scaleHeight));
                    scaledBitmap.Save(fileName, ImageFormat.Png);
                    return scaledBitmap;
                }
2
Trent