clearRect 绘制黑色而不是透明

问题描述 投票:0回答:3

似乎

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
    }
}

这就是我得到的:

我必须做什么? 我怎样才能清除我的图层,使它们透明?

java swing graphics
3个回答
1
投票

所以,这就是我过去所做的...当我用 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 位彩色图像


1
投票

我还想提一下,camickr 的解决方案也有效:

链接

g2d.setComposite(AlphaComposite.Clear);
g2d.fillRect(0, 0, (width), (height));
g2d.setComposite(AlphaComposite.SrcOver);

0
投票

您可以只使用 Graphics2D 对象函数,而不是逐像素绘图,并失去对其他绘图/填充函数的支持:

.setComposite(AlphaComposite.Src);

通过这种方式,您可以直接将任何图像缓冲区的颜色/Alpha 通道复制到另一个图像缓冲区,绕过 Alpha 处理,消除任何直接复制 Alpha 通道的尝试。

© www.soinside.com 2019 - 2024. All rights reserved.