java - clearRect 绘制黑色而不是透明

标签 java swing graphics

似乎 clearRect 没有将我的 BufferedImage 设置为透明而是黑色。创建一个新的 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
    }
}

这就是我得到的:

enter image description here

我必须做什么? 如何清除图层,使它们透明?

最佳答案

所以,这就是我过去所做的...当我使用 swing 将 BufferedImage 绘制到 Component 时,我将单独设置像素颜色值。

同样的概念可以应用于清除BufferedImage。您可以通过调用bi.setRGB()来设置像素int[]。您需要提供相当多的参数来设置数组,但不用担心,我将逐一介绍。

bi.setRGB(intstartingX,intstartingY,intwidth,intheight,int[]sourceArray,intoffset,intscanSize);

在此实例中,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.TYPE_INT_ARGB 创建 BufferedImage,要么您读入图像,它只是一个缺少 Alpha channel 的 24 位彩色图像

关于java - clearRect 绘制黑色而不是透明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43922079/

相关文章:

java - mvn install 查找在我的 java 目录中嵌套太深的 tools.jar

java - 在里面渲染一个图标

java - 如何在Java中的for循环中创建多个复选框?

user-interface - BlackBerry - 在屏幕上绘制图像

ios - 随机移动应用图标生成算法

html - 使用 SVGZ 而不是 SVG 的缺陷是什么?

java - 访问自定义组件的 AttributeSet 中的属性

java - Spring Boot 序列化 JSON

java - SAXParseExceptions : catalog of cvc-errors

java - 使用 MigLayout 时, `add` 的第三个 int 参数将如何影响布局?