複数の画像を 1 つの大きな画像にまとめようとしており、配置を最適に決定するアルゴリズムを探しています。画像を回転またはサイズ変更することはできませんが、結果の画像の位置は重要ではありません。
編集:サイズ変更制約を追加しませんでした
おそらく、次のようなものを探しているでしょう: Automatic Magazine Layout。
どうやらそれは「パッキング問題」と呼ばれ、ゲームプログラミングでよく使われるものです。興味のある方のために、推奨される実装をいくつか示します。
ライトマップのパッキング、 長方形のパッキング、および 長方形の配置
最適なパッキングは困難ですが、問題のドメインの詳細によっては単純化できる可能性があります。いくつかのアイデア:
ビットマップを同じサイズのタイルに分割できる場合、パッキングは簡単です。次に、必要に応じて、タイルからビットマップを再構築します。
画像を最大から最小に並べ替え、画像ごとに貪欲なアロケーターを使用して、画像に適合する最初の使用可能なサブ長方形を選択します。
遺伝的アルゴリズムを使用します。ランダムに選択されたいくつかのレイアウトから始めます。どれだけ密集しているかに基づいてスコアを付けます。スコアの高いものからソリューションを組み合わせて、許容できるスコアになるまで繰り返します。
私はこのアルゴリズムを作成しました。これは実際にはNP-Hard Bin のパッキング問題の変形ですが、ビンのサイズは無限です。
それに関するいくつかの記事を見つけて、アルゴリズムを最適化しようとすることもできますが、最終的にはあらゆる可能性を試して、結果のビン サイズを最小化しようとする強引な方法のままです。
最善の解決策が必要ではなく、1 つの解決策だけが必要な場合は、すべての組み合わせをブルート フォーシングすることを避けることができます。私も一度それを行うプログラムを作成しました。
説明:
Images: array of the input images
ResultMap: 2d array of Booleans
FinalImage: large image
ResultMap は、現在の FinalImage に画像を収めることができるかどうかをすばやく確認するために使用されます。int32 を使用し、各ビットを 1 ピクセルに使用するように最適化できます。これにより、(マスクを使用して) 32 ビットを一度にチェックできるため、メモリが削減され、パフォーマンスが向上します。ただし、画像のエッジを作成するために必要なマスクについて考える必要があるため、より困難になります。
Now I will describe the real loop of the "algorithm".
It's not optimal, but it can solve the problem in a reasonably optimal way (especially if there are a few smaller images to fill up the gabs in the end).
プログラム以外の方法で、MSペイント機能「貼り付け元」を使用できます。つまり、(JPEG)ファイルをmspaint画像領域に貼り付けます。このuを使用すると、個々の画像を配置し、最終的な大きな画像を作成して、JPEG / GIF/Raw-BMP形式で保存できます。
-広告。