2016-09-24 6 views
0

これは難しい問題かもしれません。列/行の入力と余白の変数に基づいて空白のビットマップに最大イメージを配置し、イメージの縦横比を維持する方法

私は追いかけるだけです。その後

Bitmap MasterImage = new Bitmap(PageSize.Width, PageSize.Height, PixelFormat.Format32bppArgb); 
System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(MasterImage); 

: まず私は、空白のビットマップ画像を作成

int numOfColumns=2; //(could be any value) 
int numOfRows=4; 
: は、私は私が列と行に基づいて空白のビットマップ(ページ)に配置したいどのくらいの画像のパラメータを取得します私はいくつかの余裕を持っている場合、私は、パラメータを取得

enter image description here

は、だから我々はこのような何かを取得する必要がありますトップ画像と左画像で:List<String>の種類は、それが画像の完全なパスが含まれているimagesPath:私はと呼ばれる変数を持っているよりも

int PagetopMargin=0; //(could be any value) 
int PageLeftMargin=0; 

は今私の画像をループ:

while (imagesPath.Count > 0) 
    { 
     Image image = Image.FromFile(imagesPath[0]); 
    //Logic comes here. 
    //after finishing processing and drawing images in Bitmap i remove image from list 
     imagesPath.RemoveAt(0); 
    } 

私が達成しようとしています何が列/行およびマージンの変数に基づいて、そのビットマップページに最大の画像を配置する方法で、画像の縦横比を維持します。 (画像はゆがんでいません)。いくつかの画像が残っている場合は、そのokey、私はそれらを配置するために次の空白のビットマップを続けます。 Bitmapの空白イメージをいっぱいに塗りつぶすだけです。ここ

+1

問題は何ですか?長方形に収まるように画像を拡大/縮小する方法は?これだけのDrawImageオーバーロードがあります。 (2つの長方形があるもの)。 – TaW

+0

どのようにして、パラメータに基づいて長方形に収まるように画像(その画像のリスト)をスケールし、画像のアスペクト比を保持しますか? – Dror

答えて

2

は(左上整列)中心又は非中心のいずれか、別に矩形に適合する機能である:

Rectangle FitToBox(Rectangle scr, Rectangle dest, bool centered) 
{ 
    var ratioX = (double)dest.Width/scr.Width; 
    var ratioY = (double)dest.Height/scr.Height; 
    var ratio = Math.Min(ratioX, ratioY); 

    var newWidth = (int)(scr.Width * ratio); 
    var newHeight = (int)(scr.Height * ratio); 

    if (!centered) 
     return new Rectangle(0, 0, newWidth, newHeight); 
    else 
     return new Rectangle((dest.Width - newWidth)/2, 
          (dest.Height - newHeight)/2, newWidth, newHeight); 
} 

その基本的な数学をフォームthis post取られます。ここで

中心に、テストベッドであり、異なるランダムな値を使用して非中心:

enter image description hereenter image description here

Random rnd = new Random(); 

int cols = rnd.Next(3) + 2; 
int rows = rnd.Next(4) + 3; 

int w = pan_dest.Width/cols; 
int h = pan_dest.Height/rows; 
using (Graphics G = pan_dest.CreateGraphics()) 
{ 
    G.Clear(Color.White); 
    for (int c = 0; c < cols; c++) 
     for (int r = 0; r < rows; r++) 
     { 
      Rectangle rDest = new Rectangle(c * w, r * h, w, h); 
      Rectangle rSrc = new Rectangle(0, 0, rnd.Next(200) + 10, rnd.Next(200) + 10); 
      Rectangle rResult = FitToBox(rSrc, rDest, checkBox1.Checked); 
      Rectangle rDestPlaced = new Rectangle(c * w + (int)rResult.X, 
             r * h + rResult.Y, rResult.Width, rResult.Height); 

      using (Pen pen2 = new Pen(Color.SlateGray, 4f)) 
       G.DrawRectangle(pen2, Rectangle.Round(rDest)); 
      G.DrawRectangle(Pens.Red, rDestPlaced); 
      G.FillEllipse(Brushes.LightPink, rDestPlaced); 
     } 
} 

あなたは、このようにあなたのイメージを描画します:

G.DrawImage(someImageimg, rDestPlaced, rSrc, GraphicsUnit.Pixel); 

これが最大化画像サイズ番号の画像は、あなたのコメントに指定されているようにページに収めることができます。後者については、2-dimensional packingのようなものを見てください。

+0

お返事ありがとうございます。非常に興味深いコンセプトとスマートな思考!私はまだ私がテストの後にそれらをつかむとすぐに私の質問で説明するいくつかの問題があります。 – Dror

+1

私は小さな調整で導入されたあなたのテクニックを使用することができました..私はその画像は、次の画像位置パラメータをどこに配置するのかを少しビットします。ありがとう! – Dror

+0

素晴らしい!これはアスペクト比でソートするのに役立ちます。 – TaW

関連する問題