似乎
clearRect
没有将我的BufferedImage
设置为透明而是黑色。创建一个 new BufferedImage
是可行的,但我不想产生太多垃圾。
我的国际象棋程序有这个代码:
//graphics
private Graphics2D g2d;
private Graphics2D gLayer1;
private Graphics2D gLayer2;
private Graphics2D gLayer3;
public BufferedImage imgLayer1;
private BufferedImage imgLayer2;
private BufferedImage imgLayer3;
private Game() throws IOException {
//initialize...
imgLayer1 = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_ARGB);
gLayer1 = imgLayer1.createGraphics();
imgLayer2 = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_ARGB);
gLayer2 = imgLayer2.createGraphics();
imgLayer3 = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_ARGB);
gLayer3 = imgLayer3.createGraphics();
}
//main
public static void main(String[] args) throws IOException {
//initialize frame
}
public void run() {
while (isRunning) {
updateGraphicsLayer1();
updateGraphicsLayer2();
updateGraphicsLayer3();
repaint();
}
}
protected void paintComponent(Graphics g) {
g2d = (Graphics2D) g;
g.drawImage(imgLayer1, 0, 0, null);
g.drawImage(imgLayer2, 0, 0, null);
g.drawImage(imgLayer3, 0, 0, null);
g2d.dispose();
}
public void updateGraphicsLayer1() {
if (redrawLayer1) {
gLayer1.clearRect(0, 0, WIDTH, HEIGHT);
//draw this layer
}
}
public void updateGraphicsLayer2() {
if (redrawLayer2) {
gLayer2.clearRect(0, 0, WIDTH, HEIGHT);
//draw this layer
}
}
public void updateGraphicsLayer3() {
if (redrawLayer3) {
gLayer3.clearRect(0, 0, WIDTH, HEIGHT);
//draw this layer
}
}
这就是我得到的:
我必须做什么? 我怎样才能清除我的图层,使它们透明?
所以,这就是我过去所做的...当我用 swing 将
BufferedImage
绘制到 Component
时,我将单独设置像素颜色值。
同样的概念可以应用于清除
BufferedImage
。您可以通过调用 int[]
设置像素 bi.setRGB()
。您需要提供相当多的参数来设置数组,但不用担心,我将逐一介绍。
bi.setRGB(int startingX, int startingY, int width, int height, int[] sourceArray, int offset, int scanSize);
在这种情况下startingX和startingY应该为0。
宽度和高度就是您所期望的(
bi.getWidth(), bi.getHeight()
)
sourceArray 将是您用 0 填充的
int[]
在本例中偏移量应为 0
scanSize 将只是
bi.getWidth()
所以,让我们看一些代码来清除你的
BufferedImage
int[] pixels = new int[bi.getWidth()*bi.getHeight()];
Arrays.fill(pixels, 0);
bi.setRGB(0, 0, bi.getWidth(), bi.getHeight(), pixels, 0, bi.getWidth());
如果这不能清除您的
BufferedImage
,那么要么您没有使用 BufferedImage
创建 BufferedImage.TYPE_INT_ARGB
,要么您正在读取图像,并且它只是一个缺少 Alpha 通道的 24 位彩色图像
我还想提一下,camickr 的解决方案也有效:
g2d.setComposite(AlphaComposite.Clear);
g2d.fillRect(0, 0, (width), (height));
g2d.setComposite(AlphaComposite.SrcOver);
您可以只使用 Graphics2D 对象函数,而不是逐像素绘图,并失去对其他绘图/填充函数的支持:
.setComposite(AlphaComposite.Src);
通过这种方式,您可以直接将任何图像缓冲区的颜色/Alpha 通道复制到另一个图像缓冲区,绕过 Alpha 处理,消除任何直接复制 Alpha 通道的尝试。