Java: Umwandeln von Glyphs fehlerhaft

OP Persönliche Seite #1566708
Hallo an alle,

Ich schreibe gerade ein Tool, das mir einen Zeichensatz mit einer 
bestimmten Font in ein "Pixel-Array" umwandelt, um es für ein LCD zu 
nutzen.

Dazu habe ich eine Klasse, die mir genau ein Zeichen Umwandelt. Ich gebe 
das konvertierte Zeichen per Ascii-Art auf der Konsole aus. Leider 
werden manche Zeichen unvollständig erzeugt:

H:
1
        
2
 #      
3
 #      
4
 #      
5
 #      
6
 #######
7
 ##    #
8
 #      
9
 #      
10
 #      
11
 #

N:
1
        
2
 ##     
3
 ##     
4
 ###    
5
 # ##   
6
 #  #   
7
 #   #  
8
 #   ## 
9
 #    ##
10
 #     #
11
 #     #
Die beiden Zeichen sind Arial, 14.

Hierzu der Konstruktor der Klasse:
1
public LcdGlyph(String c, Font f)
2
    {
3
        this.c = c;
4
        this.f = f;
5

6
        FontRenderContext fontRendContext = new FontRenderContext(null, true, true);
7
        GlyphVector glyphVector = f.createGlyphVector(fontRendContext, c);
8

9
        Rectangle2D bounds = glyphVector.getPixelBounds(fontRendContext, 0, 0);
10
        int width = (int)bounds.getWidth();
11
        int height = (int)bounds.getHeight();
12

13
        BufferedImage bn = new BufferedImage(width, height, BufferedImage.TYPE_BYTE_BINARY);
14
        Graphics2D g2d = bn.createGraphics();
15
        g2d.drawGlyphVector(glyphVector, 0,(float)height);
16

17
        WritableRaster raster = bn.getRaster();
18
        DataBuffer buffer = raster.getDataBuffer();
19
        SampleModel model = bn.getSampleModel();
20

21
        for(int i=0; i<raster.getHeight(); i++)
22
        {
23
            for(int j=0; j<raster.getWidth(); j++)
24
            {
25
                int pixel[] = model.getPixel(j, i, (int[])null, buffer);
26

27
                if(pixel[0]>0)
28
                {
29
                    System.out.print("#");
30
                }
31
                else
32
                {
33
                    System.out.print(" ");
34
                }
35

36
            }
37
            System.out.println();
38
        }
39
    }

Andere Zeichen werden richtig erzeugt.

Kann mir jemand Tipps dazu geben?

lg Robert
Gast #1566717
Es sieht ganz so aus, als ob irgendwo in deinem Programm deine Grafik in 
der Breite abgeschnitten wird. Kann es evtl hier sein:

Robert S. schrieb:
1
g2d.drawGlyphVector(glyphVector, 0,(float)height);

(Ich habe keine Ahnung... aber der Aufruf sieht mir irgendwie 
unsymmetrisch aus ;) )

Gruesse

Marvin
Gast #1567345
Hallo,

warum zeichnest du das Zeichen nicht einfach auf den Windows-Bildschirm 
und fragst die Pixel ab? Das heisst du benutzt den Renderer von Windows 
und nicht etwas Unbekanntes.

Gruss Reinhard
Persönliche Seite #1567869
Also....
Ein Buffered Image ist hierfür erstmal völlig korrekt!
Das ganze auf den Bildschirm zu zeichnen macht nur mehr Probleme als das 
es hilft.

Du solltest aber den Fontrenderkontext des BI nutzen und nicht einen 
eigenen erstellen!
Unter Umständen solltest du außerdem mal vom GV die getVisualBounds() 
Methode nutzen, sowie das BI mal auf einem Label zur Anzeige bringen ob 
das ganze ein Zeichenproblem ist oder ob deine Konvertierung BI --> 
ASCII irgendwie spinnt.

In diesem Falle läßt sich der Pixelwert auch viel einfacher direkt über 
das BI mittels getRGB(intx int y) abfragen.
OP Persönliche Seite #1574370
Läubi .. schrieb:
> Du solltest aber den Fontrenderkontext des BI nutzen und nicht einen
> eigenen erstellen!
> Unter Umständen solltest du außerdem mal vom GV die getVisualBounds()
> Methode nutzen, sowie das BI mal auf einem Label zur Anzeige bringen ob
> das ganze ein Zeichenproblem ist oder ob deine Konvertierung BI -->
> ASCII irgendwie spinnt.

Danke für die Tipps. Dazu habe ich noch Fragen. Um ein BufferedImage zu 
erzeugen, benötige ich deren Größe. Wenn ich daraus den FontRenderer 
erzeuge weiß ich vorher noch nicht wie groß das Glyph sein wird:
1
BufferedImage bn = new BufferedImage(width, height, BufferedImage.TYPE_BYTE_BINARY);
2
GlyphVector glyphVector = f.createGlyphVector(g2d.getFontRenderContext(), c);
3
g2d.drawGlyphVector(glyphVector, 0,(float)height);

lg Robert
#1574935
GlyphVector.getGlyphOutline().getPathIterator(),

dann mit currentSegment() und next() die Koordinaten abfragen.

EDIT: Das geht dann ohne zu zeichnen. Aber du kannst dir auch einen 
eigenen Graphic-Context für die Konsole schreiben. Wäre dann natürlich 
eleganter. Aber wie oben beschrieben ist auf jeden Fall eine gute Lösung 
ohne den Aufwand beim Zeichnen auf ein Control!

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 16 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.