【问题标题】:Java AWT text produces artifactsJava AWT 文本生成工件
【发布时间】:2017-05-15 02:07:01
【问题描述】:

我正在尝试在一些纯色背景上绘制一些文本,并且在文本周围出现了一些伪影。有没有办法让写作变得干净利落?

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

它正在产生一些工件,如下所示:

任何其他方面的建议也将不胜感激。

谢谢!

【问题讨论】:

  • 呃,什么文物;抱歉,我只看到一个带有一些白色文本的蓝色矩形;没有什么看起来“乱七八糟”的东西?!
  • 伪影就在文本的边缘。这是因为 JPEG 压缩质量问题。 @Boann 为我指明了正确的方向。

标签: java awt


【解决方案1】:

我不太确定您指的是混叠伪影还是 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 质量级别。

【讨论】:

  • 感谢博安!原来是JPEG压缩级别。我对如何设置它进行了单独的搜索,并最终出现在您发送的同一个链接中(起初没有看到链接)。我以为我之前已经用 PNG 尝试过,但看起来我在做纯色块之前做了 PNG,所以当时我没有看到 PNG 与 JPEG 的问题。将压缩质量设置为 90% 可解决此问题。
猜你喜欢
  • 2013-08-23
  • 2017-02-18
  • 2013-06-08
  • 2014-10-03
  • 2010-12-19
  • 2019-11-08
  • 2017-05-19
  • 2011-04-16
相关资源
最近更新 更多