容器的屏幕截图有黑色背景而不是白色

时间:2017-01-13 14:30:46

标签: java awt screenshot

我有一个小的java程序,目的是使用相同的程序拍摄特定组件的屏幕截图。

这是它的MCVE

import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;

@SuppressWarnings("serial")
public class Screen {

    public static void main(String[] args) {
        Frame frame = new Frame("Screen Test!");
        frame.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent we) {
                frame.dispose();
             }
         });

        Container container = new Container() {

            @Override
            public void paint(Graphics g) {
                super.paint(g);
                g.setColor(Color.RED);
                g.fillRect(5, 5, 10, 10);
            }
        };

        Dimension dimension = new Dimension(50, 50);
        container.setPreferredSize(dimension);

        frame.add(container);
        frame.pack();
        frame.setVisible(true);

        BufferedImage bufImage = new BufferedImage(dimension.width, dimension.height, BufferedImage.TYPE_INT_RGB);
        container.paint(bufImage.createGraphics());

        File outputfile = new File("image.jpg");
        try {
            ImageIO.write(bufImage, "jpg", outputfile);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

运行代码时会生成此文件。

Black Background

但是,我应该得到一个看起来像这样的输出文件。

White Background

我做错了什么或错过了一步吗?

1 个答案:

答案 0 :(得分:2)

我想你可以试试:

frame.setBackground(Color.WHITE);

在添加container

之前

别忘了导入颜色

import java.awt.Color;

我认为这是因为没有定义背景,并且窗口会自动用白色填充它,但实际上没有背景颜色,导致它在屏幕截图中显示为黑色。

编辑:

我的不好,您需要将backgroundColor添加到用于将容器绘制到图像的Graphics。

试试这个:

Graphics2D graphs = bufImage.createGraphics();
graphs.setBackground(Color.WHITE);
graphs.clearRect(0, 0, dimension.width, dimension.height);           
container.paint(graphs);

方法clearRect用于使用您定义的颜色实际绘制背景。