Toon posts:

java grafische text printen

Pagina: 1
Acties:
  • 100 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Hoi allemaal,

Ben nou al een tijdje bezig om een BufferedImage met text erin netjes te printen. Maar de uitvoer op papier ziet er slecht uit. Text is amper leesbaar (Font arial size 10).

Het text tekenen op de Image gaat als volgt (stukje van de code). Graphics2D g is graphics van een BufferedImage. De BufferedImage wordt geprint.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public static Font PRINT_TEXT_FONT = new Font("Arial",Font.PLAIN,10);

public void drawForPrinting(Graphics2D g,int beginPos,double scaleFactor,int bovenDorpelDikte,int onderDorpelDikte,int linkerStijlDikte,int rechterStijlDikte)
  {
    //set properties op graphics: als ik anti alias aan zet
    //word het vlekkerig
    g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_OFF);
    g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,RenderingHints.VALUE_TEXT_ANTIALIAS_OFF);
    g.setStroke(new BasicStroke(0.0f,BasicStroke.CAP_SQUARE,BasicStroke.JOIN_MITER));
    g.setColor(Color.black);


         
//maak linkerStijl text shape
java.awt.font.TextLayout tl = new java.awt.font.TextLayout(""+linkerStijlDikte, PRINT_TEXT_FONT, g.getFontRenderContext());
Shape text_shape = tl.getOutline(null);
//teken text shape
//g.fill(text_shape);
g.draw(text_shape);
}

Ik gebruik drawString van Graphics niet omdat ik graag een shape van de text wil hebben om het te roteren en moven voor de text te tekenen (deze code is weggelaten). Oh ja ik gebruik jdk1.3.1

  • Jelmer
  • Registratie: Maart 2000
  • Laatst online: 05:49
Ik zou het tekenen anders doen, TextLayout heeft een eigen draw (zie api).
code:
1
2
3
java.awt.font.TextLayout tl = new java.awt.font.TextLayout(""+linkerStijlDikte, PRINT_TEXT_FONT, g.getFontRenderContext());

tl.draw(g, 0.0,0.0);

Verwijderd

Topicstarter
Op dinsdag 26 maart 2002 13:19 schreef Jelmer Barhorst het volgende:
Ik zou het tekenen anders doen, TextLayout heeft een eigen draw (zie api).
code:
1
2
3
java.awt.font.TextLayout tl = new java.awt.font.TextLayout(""+linkerStijlDikte, PRINT_TEXT_FONT, g.getFontRenderContext());

tl.draw((Graphics2D)g, 0.0,0.0);
En het roteren van de text, of moet ik dan de g.setRotation... gebruiken (doe ik liever niet).

  • Jelmer
  • Registratie: Maart 2000
  • Laatst online: 05:49
Hoe ziet de tekst er trouwens uit als je er geen transformaties op toepast? Als dat wel leesbaar is, dan is het dus duidelijk dat het daar mis gaat. Als je dan de rest van de source (met de transformaties die jij toepast) hier post, kan ik daar ook eens naar kijken.

btw, waarom wil je de setRotation() van Graphics niet gebruiken?
edit:
ik zie dat jdk1.4 geen setRotation() heeft.. alleen rotate(..)

Verwijderd

Topicstarter
Op dinsdag 26 maart 2002 13:26 schreef Jelmer Barhorst het volgende:
Hoe ziet de tekst er trouwens uit als je er geen transformaties op toepast? Als dat wel leesbaar is, dan is het dus duidelijk dat het daar mis gaat. Als je dan de rest van de source (met de transformaties die jij toepast) hier post, kan ik daar ook eens naar kijken.

btw, waarom wil je de setRotation() van Graphics niet gebruiken?
edit:
ik zie dat jdk1.4 geen setRotation() heeft.. alleen rotate(..)
De transform methodes:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
private Shape getRotatedShape(Shape s,double radians)
  {
      AffineTransform rotate_transform = AffineTransform.getRotateInstance(radians);
      return rotate_transform.createTransformedShape(s);
  }

  private Shape getMovedShape(Shape s,double newX,double newY)
  {
      double originalTextXPos = s.getBounds2D().getX();
      double originalTextYPos = s.getBounds2D().getY();
      double deltaXText = newX - originalTextXPos;
      double deltaYText = newY - originalTextYPos;
      AffineTransform moveTrans = AffineTransform.getTranslateInstance(deltaXText,deltaYText);
      return moveTrans.createTransformedShape(s);
  }

Als ik geen transforms toe heb gepast ziet het er nog steeds slecht uit. Op het scherm (monitor) ziet het er goed uit, maar daar staat anti-alias aan. Maar op de printer geeft anti-alias een vlekkerig resultaat.

Wil liever g.rotate etc niet gebruiken omdat het dan moeilijker is om de text op de goede positie te krijgen. Mischien moet ik me nog wat meer verdiepen in de translatie van het graphics object. Verder vond ik het lasstig om dan de graphics weer in de originele staat terug te krijgen.

  • Jelmer
  • Registratie: Maart 2000
  • Laatst online: 05:49
Waarom laat je TextLayout.getOutline(AffineTransform tx) de transformatie niet doen? Je geeft nu null door, maar ik zou het dus zo doen:
code:
1
Shape text_shape=tl.getOutline(AffineTransform.getRotateInstance(radians));

Kortom: laat de TextLayout het werk doen.


Maar dat lost het dus nog niet op.. Immers, zonder transformaties zeg je dat het nog een rotzooi is.. Dan heeft het stukje wat ik hier boven beschrijf waarschijnlijk al helemaal geen effect. Misschien dat je dan nog wat met de resolutie kunt spelen? (dus de BufferedImage voor de printer 50x zo groot maken en geschaald afdrukken)

Verwijderd

Topicstarter
Op dinsdag 26 maart 2002 13:48 schreef Jelmer Barhorst het volgende:
Waarom laat je TextLayout.getOutline(AffineTransform tx) de transformatie niet doen? Je geeft nu null door, maar ik zou het dus zo doen:
code:
1
Shape text_shape=tl.getOutline(AffineTransform.getRotateInstance(radians));

Kortom: laat de TextLayout het werk doen.
Oke, bedankt ik zal het proberen.
Maar het is toch vreemd dat alles op het scherm er goed en strak uitziet terwijl op de printer (een goede HP laser A3 printer met hoge resolutie) het er slecht uitkomt

  • Jelmer
  • Registratie: Maart 2000
  • Laatst online: 05:49
Op dinsdag 26 maart 2002 13:51 schreef wimper het volgende:

[..]

Oke, bedankt ik zal het proberen.
Maar het is toch vreemd dat alles op het scherm er goed en strak uitziet terwijl op de printer (een goede HP laser A3 printer met hoge resolutie) het er slecht uitkomt
Je zegt het zelf al, de printer heeft een hogere resolutie. Neem eens een plaatje van het web dat op 72dpi is gemaakt en druk die maar eens af op een 600dpi printer.. ziet er niet uit..

Verwijderd

Topicstarter
Op dinsdag 26 maart 2002 13:52 schreef Jelmer Barhorst het volgende:

[..]

Je zegt het zelf al, de printer heeft een hogere resolutie. Neem eens een plaatje van het web dat op 72dpi is gemaakt en druk die maar eens af op een 600dpi printer.. ziet er niet uit..
Ik denk dat ik het weet:

mijn BufferedImages die geprint moeten worden save ik weg als jpg's. Die worden vervolgens in een html pagina gevoegd, die vervolgens in een textarea geladen en met de printoplossing die ik heb gekocht afgedrukt. Als ik nou de resolutie van de jpg's hoger zet (weet niet of dit mogelijk is) of er gif's van maak en die vervolgens afdruk moet ik er zijn.

  • Jelmer
  • Registratie: Maart 2000
  • Laatst online: 05:49
Zorg er in iedergeval voor dat je BufferedImage bijv. 2500x zoveel pixels bevat (dus gewoon de hoogte en de breedte 50x zo groot maken). Vervolgens kun je gewoon dan in de HTML pagina hard opnemen hoe groot je het plaatje moet worden. (dus Afbeeldingslocatie: http://jouwPlaatje.jpg)

edit:
50x hoogte en breedte is 2500x zoveel pixels... 50x zoveel pixels is ongeveer 7x h en b

Verwijderd

Topicstarter
Op dinsdag 26 maart 2002 14:14 schreef Jelmer Barhorst het volgende:
Zorg er in iedergeval voor dat je BufferedImage bijv. 50x zoveel pixels bevat (dus gewoon de hoogte en de breedte 50x zo groot maken). Vervolgens kun je gewoon dan in de HTML pagina hard opnemen hoe groot je het plaatje moet worden. (dus Afbeeldingslocatie: http://jouwPlaatje.jpg)
He bedankt, dit is een simpele slimme oplossing die zonder teveel aanpassingen werkt. Was al in Advanced Imaging api aan het zoeken.

Wordt alleen wel heel erg langzaam dan.
Pagina: 1