2016-08-12 3 views
1

Ich habe eine Datei, font_file.bdf, und müssen die darin enthaltenen Zeichen als numpy Arrays, wo jedes Element ein Pixel ist.Numpy Array von Zeichen in BDF-Datei

Hier ist der Ausschnitt dieser Datei, der das '?' Zeichen:

STARTCHAR question 
ENCODING 63 
SWIDTH 1000 0 
DWIDTH 6 0 
BBX 5 7 0 0 
BITMAP 
70 
88 
08 
10 
20 
00 
20 
ENDCHAR 

Ich recherchierte .bdf-Dateien, um zu verstehen, wie sie Daten kodieren. Im Grunde genommen handelt es sich um eine Bitmap mit einer Bittiefe von 1. Ich habe ein Kissenmodul namens PIL.BdfFontFile gefunden, das bdf-Dateien interpretieren kann. Nachdem er mit diesem Modul ein Experimentieren, während ich in der Lage war, ein PIL Bild für jedes der Zeichen in der Schriftart zu erhalten und speichern Sie sie, um zu sehen, dass es wie so funktioniert:

from PIL.BdfFontFile import BdfFontFile 

fp = open("font_file.bdf", "r") 
bdf_file = BdfFontFile(fp) 
bdf_file.compile() 
char = '?' 
_, __, bounding_box, image = bdf_file[ord(char)] 
image.save(char + ".png") 

Das gespeicherte Bild wie folgt aussieht: Question Mark. und wenn man seine Eigenschaften betrachtet, hat es eine Bittiefe von 1, was einen Sinn ergibt. (Ich bin nicht sicher, warum es umgekehrt zu sein scheint, aber ich konnte diese Art von Manipulation mit numpy tun, wenn nach wie vor erforderlich.)

Einmal hatte ich, dass ich versuchte, eine numpy Array zu konvertieren:

print numpy.array(image, dtype=numpy.int) 

, die mir eine Reihe gab, die nicht mehr das entsprechende Zeichen zu repräsentieren scheint mehr:

[[1 1 1 1 1] 
[0 1 0 1 1] 
[1 1 1 1 1] 
[1 1 1 1 0] 
[1 0 1 0 1] 
[1 0 1 1 1] 
[0 1 1 1 1]] 

ich etwas Hoffnung, dass mehr sah wie folgt aus:

[[0 1 1 1 0] 
[1 0 0 0 1] 
[0 0 0 0 1] 
[0 0 0 1 0] 
[0 0 1 0 0] 
[0 0 0 0 0] 
[0 0 1 0 0]] 

Im schlimmsten Fall könnte ich selbst einen Algorithmus erstellen, der die Daten im PIL-Bild in ein numpliges Array konvertiert, aber ich glaube, dass es einen einfacheren Weg geben muss, wenn ich zwischen PIL-Bildern und numpy Arrays umwandele (Es ist normalerweise ziemlich einfach.)

Irgendwelche Ideen über, wie man das PIL Bild erhält, um in ein numply Array richtig zu konvertieren oder eine andere Lösung zu meinem Problem würde geschätzt werden.

+0

Was bedeutet 'image' aussehen, bevor Sie versuchen, konvertieren es zu einem numply array? – Anonymous

+0

@jphollowed, Es sieht wie ein Fragezeichen aus (obwohl die Pixel im Zeichen weiß sind und der Hintergrund schwarz ist). Ich habe das Bild beigefügt, obwohl es ein extrem kleines Bild ist, ist es schwer zu sehen. –

+0

nein ich meine, was Tour-Variable 'Bild' sieht aus, wenn Ihre printit – Anonymous

Antwort

0

Es stellt sich heraus, dass das unerwartete Verhalten, das ich sah, auf einen Fehler in PIL zurückzuführen war, wie in dieser SO-Frage beschrieben: Error Converting PIL B&W images to Numpy Arrays.

Also der Schlüssel zur Lösung meines Problems war, das Bild in Graustufen zu konvertieren, bevor Sie das numpy Array erstellen.

Meine letzte Lösung eine kleine numpy Umwandlung in das beschriebene Format mit dabei war wie folgt:

fp = open("font_file.bdf", "r") 
bdf_file = BdfFontFile(fp) 
bdf_file.compile() 
char = '?' 
_, __, bounding_box, image = bdf_file[ord(char)] 
print numpy.array(image.convert('L'))/255 

, die mir dies gab:

[[0 1 1 1 0] 
[1 0 0 0 1] 
[0 0 0 0 1] 
[0 0 0 1 0] 
[0 0 1 0 0] 
[0 0 0 0 0] 
[0 0 1 0 0]]