首页 > 解决方案 > Java awt Graphics2D文本渲染反别名有深色轮廓

问题描述

我正在将白色文本渲染到 BufferedImage,并将其显示在白色背景上,以找出我的文本不完美的原因。启用 AA 时,即使是白色背景上的白色文本也会有深色轮廓。

最初我认为这是由于透明像素的 RGB 值为 0,因此 AA 混合会导致灰色,但是我尝试用透明的白色像素刷新图像,但它不能解决问题。

请看下面的代码,我也尝试了许多不同的渲染提示组合。

    GraphicsConfiguration graphicsConfiguration = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getDefaultConfiguration();
    BufferedImage fontImage = graphicsConfiguration.createCompatibleImage(width, height, Transparency.TRANSLUCENT);
    Graphics2D graphics = (Graphics2D) fontImage.getGraphics();
    FontRenderContext context = graphics.getFontRenderContext();
    graphics.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_HRGB);
    graphics.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON);
    graphics.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
    graphics.setRenderingHint(RenderingHints.KEY_ALPHA_INTERPOLATION, RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY);
    graphics.setRenderingHint(RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDER_QUALITY);

    graphics.setFont(font);

    //flush all pixels with clear white
    Color c = new Color(255, 255, 255, 0);
    graphics.setColor(c);
    graphics.fillRect(0, 0, width, height);
    graphics.setColor(Color.white);
    graphics.drawString(String.valueOf(str), 0, ascent);

结果 - 没有 AA: 在此处输入图像描述 有 AA: 在此处输入图像描述

如您所见,白色文本周围有一个清晰的黑色轮廓,我希望什么也看不到。

标签: javaawtbufferedimagegraphics2dtext-rendering

解决方案


推荐阅读