2012-05-04 22 views
36

System.Drawing.Bitmapを少なくとも一定の幅と高さに調整します。これはウェブサイト上の画像ギャラリーのサムネイルを生成するために、アスペクト比を同じにしたいと考えています。アスペクト比を維持しながらSystem.Drawing.Bitmapを指定されたサイズにスケーリング

私はいくつかの解決策をいくつか持っていますが、本当に私が必要とするものはありません。幅や高さを同じに保つことに基づいてスケーリングの周りを回転しますが、両方を変更することはありません。

例:私は4272 2848により画像があると私は、768 1024のサイズにスケーリングする場合

は、結果として得られる画像は、683 1024であると(黒枠で)埋められなければなりません必要なサイズよりも大きく、必要なサイズよりも小さい画像や、一度拡大縮小して必要な正確なサイズになっていないパッド画像でも、どうすればいいですか?

+0

他の次元を計算するために数学を行うだけの理由はありますか? –

+0

@CodyGray "その他"の次元は正確に何ですか?アスペクト比を維持しながら縮小する必要がある2次元画像です。私はちょうどアスペクト比を取って、目標サイズに近い幅と高さの共通点を見つけようとしましたが、それは正しく機能しませんでした。 –

答えて

38

目標パラメータ:

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, new Rectangle(((int)width - scaleWidth)/2, ((int)height - scaleHeight)/2, scaleWidth, scaleHeight)); 

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

+1

これにより、黒い単色のイメージが作成されます。 –

+0

完全に私のために働く、あなたが問題を見つけたと確信しない限り、downvoteする必要はありません。 'FillRectangle'行を削除し、あなたが得るものを見てください。ちょうど再びテストされ、それは正常に動作します。私はそれが違いをもたらすならば、.NET 4.0にいる。 – yamen

+0

ターゲットディメンションが両方ともイメージのディメンションより小さい場合は機能しません。 'scale'は0.0になります。また、アスペクト比は、私が理解できるものから、まったく保持しません。 –

99

ビットマップコンストラクタを内蔵リサイズしている。

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を参照してください。

+2

ありがとうございます。これは多くの助けとなりました。これは少し古い答えですが、私の新しいイメージがぼやけて見える理由がありますか?補間モードを設定する必要はありますか? – theGreenCabbage

+1

これは新しい小さなビットマップの中に元のビットマップを描画するだけではありませんか?画像の一部をカットしてください。 – DerpyNerd

+2

* TFMへのリンクはすぐそこにあります:*指定された既存のイメージからビットマップクラスの新しいインスタンスを初期化します**指定されたサイズに拡大/縮小します** 。* –

関連する問題