2009-06-02 9 views
0

mit Java und jna I rufen eine fonction: trace (potrace_ bitmap_s)Structure of Image

struct potrace_bitmap_s { 
int w, h; 
int dy; /* scanline offset in words */ 
potrace_word *map; /* pixel data, dy*h words */ 
}; 
typedef struct potrace_bitmap_s potrace_bitmap_t; 

w, h: sind die Breite und Höhe einer Bitmap

in doc der Bibliothek ein fanden diese

Hier ist potrace_word ein unsignierter Ganzzahltyp , der in potracelib.h definiert ist. Es ist normalerweise gleich einem ursprünglichen Maschinenwort (d. H. 32 Bits auf einer 32-Bit-Architektur). In der folgenden Erklärung gehen wir davon aus, dass der Typ potrace_word N Bits enthält.

Ein Bitmap der Dimensionen w * h ist geteilt, von unten nach oben, in h horizontale Scanlinien. Jede Scanlinie ist geteilt, von links nach rechts, in Blöcke von N Pixel. Jeder solcher Block von N Pixeln wird als einzelnes potrace_word gespeichert, mit dem äußersten linken Pixel des Blockes zum höchstwertigen Bit des Worts entspricht, und die am weitesten rechts liegenden Pixel des Blockes zu entsprechen das niedrigstwertige Bit von das Wort. Pixel, die „ein“ (oder „schwarz“ oder „Vordergrund“) sind, werden nach und nach Wert 1 Pixel dargestellt, die „aus“ (von „weißen“ oder „Hintergrund“) sind, werden durch Bitwert 0 repräsentieren Wenn die Anzahl der Bits in einer Scanline nicht durch N teilbar ist, dann wird das am weitesten rechts liegende Wort der Scanline auf der rechts mit Nullen aufgefüllt. Die Daten für Scanline 0 (die unterste Scanline) beginnt bei map [0]. Die Daten für Scanline 1 beginnen bei map [dy]. Die Daten für Scanline 2 beginnen bei map [2 * dy], und so weiter. Beachten Sie, dass dy entweder positiv oder negativ sein kann, je nachdem auf, wie eine Anwendung aus den Bilddaten im Speicher legen möchte.

aber ich habe nicht verstanden, wie ich in Java-Karte darstellen kann.

Antwort

1

Dies ist eine ziemlich standardmäßige Möglichkeit, ein 2-farbiges Bild zu speichern, wie Sie es von einem Fax-kodierten Tiff bekommen. Die "Map" soll ein Array von 32-Bit-Ganzzahlen ohne Vorzeichen sein. Ich glaube nicht, dass Java es erlaubt, uint32 zu deklarieren, aber in diesem Fall spielt es keine Rolle, denn alles, was Sie interessiert, sind die Bits.

Deklarieren Sie "Map" als ein Array von ganzen Zahlen. Um dies zu einem Bild zu machen, können Sie die Bits im Array einzeln untersuchen. Wenn Bit 0 (ich nehme eine Intel-Maschine an) des ersten Int im Array eine "1" ist, sollte das Pixel in der unteren linken Ecke des Bildes auf Schwarz gesetzt werden. Wenn es eine "0" ist, setze dieses Pixel auf Weiß. Jedes int ergibt 32 Pixel. Wenn die Breite des Bildes nicht durch 32 teilbar ist, müssen Sie überspringen. Das sagt dir "map [2 * dy]".

Wenn also beispielsweise die Bildbreite 55 ist, setzen Sie 32 Pixel mit map [0], dann setzen Sie 23 Pixel mit map [1] und beginnen dann mit der nächsten Zeile des Bildes (die neben dem unten) am ersten Bit der Karte [2].(dy für ein Bild, das 55 Pixel breit ist, wäre 2, unter der Annahme von 32-Bit-Ganzzahlen)

Machen Sie dies in einer Schleife, unten im Bild zum Höhenwert.