【发布时间】:2020-07-30 11:12:11
【问题描述】:
我尝试准备一个半透明的 BufferedImage,这样无论在背景顶部绘制此图像的任何位置,都会部分发光。为此,我使用 Graphics.drawLine() 的笔画 > 1 和 alpha 分量
然而,这不是我想要的。如果可能的话,我想用我的半透明颜色进行绘制,就好像它完全不透明一样,并且颜色的 alpha 分量只是第四个颜色分量。我想将我正在绘制的颜色(包括 alpha 组件)复制到图像中,替换之前的所有内容。
有没有办法做到这一点?
以下代码会生成一个简单的半透明红色 X,它可以让背景部分地透过它所绘制的任何位置。然而,它将在两条线相交的地方有一个较暗的部分。我希望能够在没有这个较暗部分的情况下绘制 X。这可能吗(同时仍在使用 Graphics.drawLine())?
import java.awt.*;
import java.awt.image.*;
import java.io.*;
import javax.imageio.*;
public class Test {
public static void main(String[] args) {
// create a new BufferedImage with alpha channel
BufferedImage img = new BufferedImage(100, 100, BufferedImage.TYPE_INT_ARGB);
Graphics2D g = img.createGraphics();
// set a semi-transparent color and a stroke wider than one pixel
g.setColor(new Color(255, 0, 0, 128 /* alpha; semi-transparent */));
g.setStroke(new BasicStroke(2));
// draw a cross; where the lines cross the color will (logically) be darker
g.drawLine(0, 0, 100, 100);
g.drawLine(0, 100, 100, 0);
// use the image somehow, in this case write it to file
writeImage(img, "test.png");
}
private static void writeImage(BufferedImage img, String fileName) {
try {
ImageIO.write(img, "png", new File(fileName));
}
catch (IOException e) {
System.out.println(e);
}
}
}
当然,我可以通过实现我自己的线条绘制方法并直接操作像素来手动解决这个问题。 (不确定这是否会产生我也需要的新的剪辑问题。)但是,这会大大增加我想避免的工作量。
进一步的限制:我仅限于 Java 7。
【问题讨论】:
-
也许画三条线而不是两条。在相反的方向画一条长对角线和两条短对角线。这样线条就不会重叠。只是一个建议:-)
-
对于这个特定的例子,这会起作用,是的,但不是一般的。我想在我不知道之前画过什么以及在哪里画过其他东西的地方画线。
标签: java graphics2d