2016-12-30 42 views
1

我想在一些纯色背景上绘制一些文本,并且在文本周围出现一些文物。有没有办法获得干净的文字?Java AWT文本产生文物

final BufferedImage image = new BufferedImage(400, 400, 
      BufferedImage.TYPE_INT_RGB); 

    Graphics2D g2d = (Graphics2D) image.getGraphics(); 
    g2d.setColor(Color.BLUE); 
    g2d.fillRect(0,0, image.getWidth(), image.getHeight()); 
    Font font = new Font ("Verdana", Font.PLAIN, 40); 

    AffineTransform affinetransform = new AffineTransform(); 
    FontRenderContext frc = new FontRenderContext(affinetransform, true, true); 

    TextLayout layout = new TextLayout("Hello World!", font, frc); 
    g2d.setColor(Color.WHITE); 
    layout.draw(g2d, 100, 100); 

    ImageIO.write(image, "jpg", new File("testDirtyText.jpg")); 

它生产的一些文物如下所示: enter image description here

围绕这个任何其他方面的任何建议,将不胜感激也。

谢谢!

+2

错误,什么文物;对不起,我只看到一个带有白色文字的蓝色矩形;并没有看起来“失序”? – GhostCat

+0

工件就在文字的边缘。这是因为JPEG压缩质量问题。 @波恩指出我正确的方向。 – undetected

回答

3

我不太确定你是指别名失真还是JPEG压缩失真。要修复前者,请添加:

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

有关更多呈现选项,请参见https://docs.oracle.com/javase/8/docs/api/java/awt/RenderingHints.html

要修复后,保存为PNG代替:

ImageIO.write(image, "png", new File("test.png")); 

或者,如果你真的需要一个JPEG,看到this Q&A有关设置JPEG质量水平。

+0

谢谢Boann!原来是JPEG压缩级别。我做了一个单独的搜索,如何设置它,并最终在您发送的相同链接(最初没有看到链接)。我之前认为我已经用PNG尝试了它,但是看起来我在做纯色块之前做了PNG,所以我没有看到PNG vs JPEG问题。将压缩质量设置为90%可解决问题。 – undetected