2009-12-03 16 views
7

私はかなり大きなビットマップをC#アプリケーション(6000x6000、ほとんどが透過的ですが)で作成しようとしており、描画矩形のみをサポートする特定の出力APIに描画する必要があります。画像を長方形に縮小するアルゴリズムですか?

誰かが同様の色のビットマップの一連の塗りつぶし矩形にビットマップを縮小するアルゴリズムを持っているのだろうかと思います。 1x1の長方形としてすべてを描画するのは、この目的のためには遅すぎるからです。例えば、円は大きな中心矩形に縮小され、残りの円は効率的な矩形に縮小されます。アルゴリズムは、単一画素法ではほとんどの時間がAPI自体のすべての矩形をループするので、高速である必要はありません。

+0

長方形の数を減らすためにアルゴリズムがピクセルを変更しないようにしたいと思いますか?また、どのような形の特徴があるのか​​分かりませんか?非水平または垂直線がたくさんある円のような形は、さらに多くの矩形を取ります。 –

答えて

3

古典的なQuadTree構造が必要なような音です。クワッドツリーを使用して画像を四角形に量子化する方法については、このリンクを参照してください。

CodeProjectの参考資料は、必要に応じて簡単に実装できるサンプルを提供しています。

+0

クワッドツリーの結果が、単純な行ごとのアルゴリズムよりも少ないピクセルになるという良い例はありますか?最初のリンクの例では、クワッドツリー表現は緑色の形状を描画するために22個の長方形を取ります。ピクセルごとに28個、緑色の形状を描画します。私はクワッドツリーがどのようにパーティショニングやストレージに適しているかを知ることができますが、できるだけ矩形に分解するのに最適ではありません。 –

+0

最初のリンクの例は、3つのオーバーラップする矩形、または5つのオーバーラップしない矩形で実行できます。どのバージョンを達成しようとしていますか? – Dolphin

+0

私は3または5の長方形でそのイメージを作る方法を見ます。私が理解できないことは、それがクワッドツリーにどのように関係しているかです。 –

0

アルゴリズムを簡単に実装するには、1xNの長方形を描画することが必要です。

0行目から開始し、最初の空白でないピクセルを見つけます。あなたが見ているピクセルの色が変わるまでピクセルを繰り返し続けます。今度は、1xNの長方形と同じ色のピクセルのシリーズを描画します。

実際の画像に大きな均一領域がある場合は、「十分に良い」ことがあります。絵がどのように見えるかによって、縦線を描くほうが良いかもしれません。

この方法を使用すると、半径100ピクセルの円は、一度に1ピクセルずつ処理された場合、30,000ピクセルではなく、200個の「線」を描画します。象限が落ちた場所で運が良ければ、私には四分木の分解がそのような円のために少なくとも1000個の長方形またはそれ以上を使用するように思えます。

関連する問題