在Java中用轮廓绘制字符串的更好方法吗?

时间:2018-07-13 16:24:26

标签: java image graphics awt

我需要在从图像中获得的Graphics对象上绘制带有黑色轮廓的白色文本。我首先用黑色绘制相同的文本4次(左右移动一个像素),然后使用白色绘制一次。但是,如果轮廓需要超过1px宽,这将无法很好地工作,并且确实看起来像是hack。有更好的方法吗?

final BufferedImage image = ImageIO.read(new File("./test.jpg"));

Graphics g = image.getGraphics();
g.setFont(g.getFont().deriveFont(45F));

// coordinates
int x = 100;
int y = 100;

String text = "Hello world";

g.setColor(Color.black);
g.drawString(text, x + 1, y - 1);
g.drawString(text, x + 1, y + 1);
g.drawString(text, x - 1, y - 1);
g.drawString(text, x - 1, y + 1);

g.setColor(Color.white);
g.drawString(text, x, y);

屏幕截图:https://i.imgur.com/ONLsPxy.png

1 个答案:

答案 0 :(得分:2)

另一种选择是使用下面的代码来创建形状,然后首先绘制轮廓,然后填充它:

        Graphics2D g2d = (Graphics2D)g;
        AffineTransform transform = g2d.getTransform();
        transform.translate(x, y);
        g2d.transform(transform);
        g2d.setColor(Color.black);
        FontRenderContext frc = g2d.getFontRenderContext();
        TextLayout tl = new TextLayout(text, g.getFont().deriveFont(45F), frc);
        Shape shape = tl.getOutline(null);
        g2d.setStroke(new BasicStroke(5f));
        g2d.draw(shape);
        g2d.setColor(Color.white);
        g2d.fill(shape);

输出:

enter image description here