66

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

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

例:

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

必要なサイズよりも大きく、必要なサイズよりも小さい画像でこれを行うにはどうすればよいですか?また、一度拡大縮小したときに必要な正確なサイズになっていない画像をパッドすることはできますか?

4

3 に答える 3

184

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

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

補間モードを制御したい場合は、この投稿を参照してください。

于 2013-10-24T11:57:30.630 に答える
63

ターゲットパラメータ:

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)そして、結果のファイルを保存するためにを行うことを忘れないでください。

于 2012-05-04T08:12:41.797 に答える
2

衙門の答えに追加するだけです。これは画像には最適ですが、テキストにはあまり適していません。

これを使用してテキストを拡大縮小しようとしている場合(たとえば、Word文書(この場合はWord Interopからのバイト単位))、いくつかの変更を加える必要があります。そうしないと、側面に巨大なバーが表示されます。

May not be perfect but works for me!

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;
}
于 2018-03-20T23:33:37.930 に答える