2009-12-03 8 views
7

Ich versuche, ziemlich große Bitmaps in einer C# -Anwendung zu erstellen (6000x6000, obwohl die meisten transparent sind) und sie zu einer bestimmten Ausgabe-API zu zeichnen, die nur das Zeichnen von Rechtecken unterstützt.Algorithmus, um das Bild auf Rechtecke zu reduzieren?

Nun, ich frage mich, ob jemand einen Algorithmus hat eine Bitmap in eine Reihe von gefüllten Rechtecke ähnlich farbigen Bitmaps zu verringern; denn das Zeichnen als 1x1-Rechteck ist für diesen Zweck viel zu langsam. Zum Beispiel sollte ein Kreis auf ein großes mittleres Rechteck reduziert werden, während der Rest des Kreises auf effiziente Rechtecke reduziert wird. Der Algorithmus muss nicht einmal so schnell sein, da die meiste Zeit, die ich mit meiner Ein-Pixel-Methode mache, die Schleife durch jedes Rechteck in der API selbst ist.

+0

Ich nehme an, Sie wollen nicht der Algorithmus zu ermöglichen, Pixel zu ändern, um Anzahl der Rechtecke zu reduzieren? Hast du auch eine Vorstellung davon, was die Eigenschaften der Formen sein werden? Formen wie Kreise mit vielen nicht horizontalen oder vertikalen Linien benötigen viel mehr Rechtecke. –

Antwort

3

Klingt wie Sie die klassische QuadTree Struktur brauchen würde. Unter diesem Link finden Sie eine schöne Erklärung, wie Sie mit einem Quadtree ein Bild in Rechtecke quantisieren.

Hier ist eine schöne Referenz auf CodeProject, die eine Probe, einfache Implementierung ermöglicht Sie Ihre Bedürfnisse verändern könnten.

+0

Gibt es ein gutes Beispiel dafür, wenn ein Quadbaum weniger Pixel ergibt als ein naive zeilenweise Algorithmus? Im Beispiel in der ersten Verknüpfung nimmt die Quad-Tree-Darstellung 22 Rechtecke, um die grüne Form gegenüber 28 zu zeichnen, wenn sie Pixel für Pixel gemacht werden, und nur 8, wenn Zeile für Zeile gemacht wird, wie ich in meiner Antwort beschrieben habe. Ich kann sehen, wie Quad-Bäume für die Partitionierung und/oder Speicherung gut sind, aber nicht, wie sie optimal in so wenige Rechtecke wie möglich zerlegt werden können. –

+0

Das Beispiel in der ersten Verbindung könnte in 3 überlappenden Rechtecken oder 5 nicht überlappenden Rechtecken erfolgen; Welche Version willst du erreichen? – Dolphin

+0

Ich sehe, wie man dieses Bild mit 3 oder 5 Rechtecken macht. Was ich nicht herausfinden kann ist, wie sich das auf Quadbäume bezieht. –

0

Ein einfach zu implementierender Algorithmus wäre es, 1xN Rechtecke zu zeichnen.

Starten Sie in Zeile 0 und finden Sie das erste nicht leere Pixel. Fahren Sie fort, Pixel zu durchlaufen, bis sich die Farbe der Pixel ändert, die Sie betrachten. Zeichnen Sie nun diese Reihe von gleichfarbigen Pixeln als 1xN-Rechteck.

Wenn Ihre aktuellen Bilder große einheitliche Regionen haben, könnte dies „gut genug“ sein. Je nachdem, wie die Bilder aussehen, ist es besser, vertikale Linien zu zeichnen.

Wenn ich die Mathematik richtig mache, würde ein Kreis mit einem Radius von 100 Pixeln 200 Linien verwenden, um zu zeichnen, anstatt 30.000 Pixel, wenn ein Pixel nach dem anderen gemacht wird. Es scheint mir, dass eine Quad-Tree-Dekomposition mindestens 1000 Rechtecke oder mehr für einen solchen Kreis verwenden würde, wenn Sie Glück hätten, wo die Quadranten fallen.