java - 使用 Graphics2D 实现 "punch out"文本

标签 java text graphics2d

我正在尝试在 Graphics2D 渲染上创建 Punch Out 效果。

我有一个黑色的矩形。文本颜色为红色。我希望能够将颜色设置为 0x00FF0000 并将其从背景中“冲出”。

    Graphics2D newG = (Graphics2D)g.create();
    newG.setColor(new Color(0x00,0x00,0x00,0xFF)); //255 Alpha
    newG.fillRect(box.x, box.y, box.width, box.height);

    newG.setColor(new Color(0xFF,0x00,0x00,0x00)); //0 Alpha
    newG.drawString("Welcome", box.x ,box.y);

我看到的是文本在背景下完全透明,但没有打洞。

我看到的:http://i.imgur.com/HYTe1.jpg

我期望看到的内容:http://i.imgur.com/YQwZk.jpg

如何使用 Graphics2D 实现“打洞”效果?

编辑:打洞效果就像使用前景设置为 0x00FF0000 和背景设置为 0xFF000000 的 JLabel。它从背景中“剪掉”/“打洞”文本。另外,我不希望它总是打出,只有当 alpha 为 0 时。

编辑2:我尝试了下面建议的代码,结果相同。

Rectangle stringBox = new Rectangle(x, y - fm.getHeight() + fm.getDescent(), fm.stringWidth(splitStr[i]), fm.getHeight());

TextLayout textLO = new TextLayout(splitStr[i], newG.getFont(), newG.getFontRenderContext());
 Shape sText = textLO.getOutline(newG.getTransform());      // The Shape of text
Path2D.Double shape = new Path2D.Double(stringBox);     // The rectangle
appendTextShape(shape, sText, newG.getTransform(), 0, 10);
newG.setColor(Color.black);
newG.fill(shape);
newG.setColor(new Color(0xFF, 0x00,0x00,0x00));
newG.drawString(splitStr[i], x, y);

最佳答案

http://docs.oracle.com/javase/tutorial/2d/advanced/compositing.html

正确设置构图是解决方案。 SRC_IN 是我正在寻找的作品。

关于java - 使用 Graphics2D 实现 "punch out"文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14385751/

相关文章:

java - 如何读取文件内容,写入输出流以及重新读取并存储在java内存中的字符串变量中

java - 两个不同时区之间的 Joda 时间 UTC 值不匹配

parsing - 从文本文件lua中解析科学数字

java - 使用 Graphics2D 更新旋转的 JLabel 会导致新旧文本合并在一起

java - 如何在 Java 7 中插入自己的图形

java - 如何找到用graphics2d绘制的字符串的尺寸?

java - 将包含泛型的java代码转换为scala

java - Spring 安全过滤器验证成功但发回 403 响应

text - 如何从 Flutter TextBox 中获取原始文本

jquery - 查找元素是否包含 x 但不包含 y (jQuery)