- PR -

画像の自動配置について

1
投稿者投稿内容
victor
常連さん
会議室デビュー日: 2002/10/29
投稿数: 46
お住まい・勤務地: アスンシオン - パラグアイ
投稿日時: 2006-01-12 02:22
渡辺です。初めて画像を処理するプログラムをコーディングしています。

動的に作成された無数の画像をPitureBox内に複数配置し、

@左端に寄せる、
A右端に寄せる、
B大きい順に並べる、
C小さい順に並べる

といった処理をしたいのですが、画像が重ならないように自動的に配置したり、大きさによって並べたりするアルゴリズムで煮詰まってます。 
TopやLeftなどの位置に関するプロパティ と HeightやWidth等のサイズに関するプロパティをうまく扱えばいいのは分かるんですが。。。

コ−ディングはC#でやっていますが、他の言語でもかまいませんから何か参考に出来るコードがあれば教えてください。
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2006-01-12 08:24
引用:

渡辺です。初めて画像を処理するプログラムをコーディングしています。

動的に作成された無数の画像をPitureBox内に複数配置し、
(略)
といった処理をしたいのですが、画像が重ならないように自動的に配置したり、大きさによって並べたりするアルゴリズムで煮詰まってます。 



画像処理云々は関係なくて、要するに矩形のレイアウトの問題ですね。

個人的には、大昔に読んだ TeX の版組みの戦略を参考に考えることにしてます。

2個の画像を並べるところまでは分かりますよね?

横方向に並べる場合は、1枚目の画像の上端または下端の座標と、2枚目の画像の上端または下端の座標が同じになるように、2枚目の画像の左肩座標を調整すればOKです。

3枚目を配置するのも、結局はその応用です。

2枚目の画像を配置した状態で「1枚目の画像と2枚目の画像の画像を囲む矩形」を計算します。これを「1個の大きな画像」と考えれば、2枚の画像を配置するのと同じ方法論で3枚目を配置することが出来ますよね?


_________________
// 渋木宏明 (Hiroaki SHIBUKI)
// http://hidori.jp/
// Microsoft MVP for Visual C#
//
// @IT会議室 RSS 配信中: http://hidori.jp/rss/atmarkIT/
清華
ベテラン
会議室デビュー日: 2005/12/21
投稿数: 50
投稿日時: 2006-01-12 10:19
画像を縦に並べるだけだと解釈して進めます。

画像サイズが大きい順に並べるというのが良く分かりませんが、それは縦幅が大きい順か横幅が大きい順か面積が大きい順んかによって違いますが、とりあえずいったんソートしてから並べる処理を行えばどんなソートでも使えると思います、効率もこっちのほうがいいかもしれません。
【具体例】
コード:
Bitmap[] bitmaps = something hoge hoge;
Sort(bitmaps);  // 何かしらソート
for(int i=0;i<bitmaps.Length;i++)
{
     Bitmap b = bitmaps[i];
     Set(b);    // 実際に並べる、たぶん i も使う
}


縦に並べるだけであれば、offset変数使ってやったほうが楽ですかね
コード:
int offset = 0;
foreach(Bitmap b in bitmaps)
{
    grfx.DrawImage(b,0,offset);
//  grfx.DrawImage(b,Width-b.Width,offset);    // 右寄せ
    offset += b.Height + Margin;   // Margin = 余白
}


これで余白つきでずらずら縦に並べます。


画像ビュワーのようなものを作りたいのであれば計算用の箱を準備するとらくだと思います、画像はすべてその箱ないに収まるように計算縮小(比率守って)して、あとは箱を並べるだけ、僕がビュワー作るときはそうします、後々楽なので。

こんなところでどうでしょうか?
_________________
9uiet Design - http://quietdesign.rental.allinoneserver.net/
デザインにこだわったソフトの配布とプログラミングTipsの公開(予定)をしています。
9uiet Blog - http://seiga.blog44.fc2.com/
笑ったことやプログラミングのことなど書
1

スキルアップ/キャリアアップ(JOB@IT)