Java2D text rendering quality

Dear all,

I am currently trying to get high quality rendering for monochrome text, targeting epaper viewers. I draw strings into a BufferedImage, and display it on my LCD monitor in order to quickly check the rendering quality, before transferring it to epaper. I am encountering some disappointing surprises using Java2D, and cannot get a good output quality:

- TextAttribute.WEIGHT produces only 2 different renderings, regular or bold.

- Fonts appear very very light for sizes up to 17pt, and suddenly appear bold at 18pt+ sizes

I am working under Windows XP SP 2, with JDK 1.6.0. Here follows a small piece of code illustrating the second problem. When comparing output with Photoshop or Fireworks outputs, the results are really disapointing, and I am sure that I am missing something...

Thanks in advance for any help/tip.

Sincerely,

Jean-Marie

import javax.swing.*;

import java.awt.*;

import java.awt.font.FontRenderContext;

import java.awt.font.TextLayout;

import java.awt.font.TextAttribute;

import java.awt.image.BufferedImage;

import java.text.AttributedString;

publicclass TextRenderingextends JPanel{

privatestaticfinalint WIDTH = 2000;

privatestaticfinalint HEIGHT = 8000;

privatestaticfinalint MIN_SIZE = 13;

privatestaticfinalint MAX_SIZE = 72;

privatestaticfinalint STEP = 1;

private BufferedImage buf;

public TextRendering(){

setMinimumSize(new Dimension(WIDTH, HEIGHT));

setPreferredSize(new Dimension(WIDTH, HEIGHT));

buf =new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_BYTE_GRAY);

Graphics2D g2d = (Graphics2D) buf.getGraphics();

g2d.setColor(Color.WHITE);

g2d.fillRect(0, 0, WIDTH, HEIGHT);

g2d.setColor(Color.BLACK);

g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_HRGB);

g2d.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);

g2d.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON);

// g2d.setRenderingHint(RenderingHints.KEY_TEXT_LCD_CONTRAST, 250);

FontRenderContext frc = g2d.getFontRenderContext();

Font f =new Font("Arial", Font.PLAIN, 24);

int y = 20;

for (int i = MIN_SIZE; i <= MAX_SIZE; i += STEP){

String s =new String(i +"pt- I would like to get a better rendering ! ");

AttributedString attText =new AttributedString(s);

attText.addAttribute(TextAttribute.FOREGROUND, Color.black);

attText.addAttribute(TextAttribute.FONT, f.deriveFont((float)i));

TextLayout textlayout =new TextLayout(attText.getIterator(), frc);

textlayout.draw(g2d, 10, y);

y += i + 10;

}

}

publicvoid paint(Graphics g){

Graphics2D g2d = (Graphics2D) g;

g2d.drawImage(buf, 0, 0,null);

}

publicstaticvoid main(String[] args){

JFrame f =new JFrame("Text rendering demo");

f.getContentPane().add(new JScrollPane(new TextRendering()), BorderLayout.CENTER);

f.setSize (600, 800);

f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

f.setVisible(true);

}

}

[5493 byte] By [jmg66a] at [2007-11-27 8:50:57]
# 1

Of course, the same rendering problem can be observed with the more sophisticated "Font2DTest" example which can be found in the JDK samples: with the Arial font, the text becomes "semi-bold" starting from 18pt size, whereas it is very light for sizes up to 17pt.

Thanks again for any help.

Jean-Marie

jmg66a at 2007-7-12 21:03:16 > top of Java-index,Security,Cryptography...