GeXiangDong

精通Java、SQL、Spring的拼写,擅长Linux、Windows的开关机

0%

在图片上描画文字时的抗锯齿功能

用java的 Graphics 的 drawString 往图片上描画文字的时候,文字边缘可能会出现粗糙的锯齿(如下图,上部的”文“字的放大效果),可以通过Graphics2D设置抗锯齿效果。

代码和两种的比较效果如下(只有第18行是设置抗锯齿效果的代码):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
BufferedImage img = new BufferedImage(800, 300, BufferedImage.TYPE_INT_ARGB);
Graphics g = img.getGraphics();

InputStream fi = Thread.currentThread().getContextClassLoader().getResourceAsStream("fonts/msyh.ttf");
BufferedInputStream bisYh = new BufferedInputStream(fi);
Font yahei = Font.createFont(Font.TRUETYPE_FONT, bisYh);

g.setColor(Color.WHITE);
g.fillRect(0, 0, 800, 300);

Font font = yahei.deriveFont(Font.BOLD, 48);
g.setColor(Color.BLACK);

g.setFont(font);
g.drawString("中文字体,无抗锯齿效果", 10, 50);

// 下面这行是设置文字抗锯齿效果的
((Graphics2D) g).setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
g.drawString("中文字体,有抗锯齿效果", 10, 150);

FileOutputStream fos = new FileOutputStream("target/font.png" );
ImageIO.write(img, "png", fos);

fos.flush();
fos.close();

字体

通过上图可以看出,设置抗锯齿效果后,会在文字边缘有些过度颜色的点。如果是要在单色打印机上打印(例如android下连接小票打印机),就不需要这种抗锯齿效果了,有它反而会增加麻烦,我就是在调试android下单色打印机时发现的这个效果。

描画图片时也可以设置抗锯齿效果

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