java bufferedImage真的给了黑色画布吗?

我试图通过两种不同的方法实现同样的目标 . 我想绘制一个简单的矩形 .

在第一种方法中,我简单地获取g对象并直接在其上绘制 .

public void paintComponent(Graphics g){ 
    super.paintComponent(g);
    g.drawRect(100, 100, 50, 50);
}

在第二种方法中,我在其上绘制图像画布,然后在jpanel的图形对象上绘制图像 .

public void paintComponent(Graphics g){
    super.paintComponent(g);
    BufferedImage img = new BufferedImage(500, 500, BufferedImage.TYPE_INT_RGB);
    Graphics a = img.getGraphics();
    a.drawRect(100, 100, 50, 50);       
    g.drawImage(img, 0, 0, 500, 500, null);
}

我希望两者都会产生类似的输出,但下面我在绘制图像的那个在黑色背景上给出白色矩形,而在顶部的那个在白色背景上给出黑色矩形 . 为什么会这样?

回答(3)

2 years ago

您不调用setColor(),因此使用默认颜色绘制矩形 . 两个示例中的默认颜色不同,这就是为什么您应该始终明确设置颜色(并用背景颜色填充背景) .

2 years ago

在组件上进行自定义绘制时 . 首先绘制背景 . 看来你正在扩展JComponent,它只会绘制一个白色背景 . 其他Swing组件将使用setBackground()方法指定的颜色,例如JPanel默认为灰色 . 然后将图形对象设置为组件的前景色,以便您可以进行自定义绘制 . 默认前景色为黑色 .

当您创建BufferedImage时,默认情况下它看起来像是用黑色背景填充,然后Graphics对象的颜色设置为WHITE,因此您可以进行自定义绘制,它将显示在黑色背景上 . 您始终可以将缓冲图像的背景填充为任何颜色,然后更改图形对象以使用前景的任何颜色 .

2 years ago

您正在使用TYPE_INT_RGB . 您可以探索其他类型at this link . TYPE_INT_ARGB支持透明背景,这是您可能正在寻找的 .

但它并不像设置类型那么简单 . 嵌入时背景颜色也会受到组件类型的影响,或者将其保存为文件时会受文件格式的影响 . 例如,PNG是一种支持透明度的文件格式 . 您将不得不尝试使用不同的组件类型来查看它们是否会影响透明度 .