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);
}
}

