将 JFrame 保存为具有透明背景的图像
Save JFrame as image with transparent background
很抱歉,我知道有很多这样的问题,但我就是找不到解决方案。我尝试了不同的方法,但就是无法使背景透明。这是我的测试代码:
public class Pngs extends JPanel {
public void paint(Graphics g) {
Image img = createImage();
g.drawImage(img, 0, 0, this);
}
public static BufferedImage getScreenShot(
Component component) {
BufferedImage image = new BufferedImage(
component.getWidth(),
component.getHeight(),
BufferedImage.TYPE_INT_RGB
);
// call the Component's paint method, using
// the Graphics object of the image.
component.paint(image.getGraphics());
return image;
}
private static Image createImage() {
BufferedImage img = null;
try {
img = ImageIO.read(new File("oneImg.png"));
} catch (IOException e) {
}
return img;
}
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.getContentPane().add(new Pngs());
frame.setUndecorated(true);
frame.getContentPane().setBackground(new Color(1.0f, 1.0f, 1.0f, 0.5f));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(512, 512);
frame.setVisible(true);
try { //saves the image
// retrieve image
BufferedImage bi = getScreenShot(frame.getContentPane());
File outputfile = new File("saved.png");
ImageIO.write(bi, "png", outputfile);
} catch (IOException e) {
}
}
}
我尝试将 Color 构造函数的第 4 个参数设置为 0,这样它将完全透明,但我只得到黑色背景。另外,当它设置为 0.5f 时,它根本不透明。
可能是什么问题?
使用 BufferedImage.TYPE_INT_ARGB
而不是 BufferedImage.TYPE_INT_RGB
。
顺便说一句:使用此代码创建正确的屏幕截图:
public static BufferedImage getScreenShot(Component component) throws AWTException {
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice gd = ge.getDefaultScreenDevice();
Robot robot = new Robot(gd);
Rectangle bounds = new Rectangle(component.getLocationOnScreen(), component.getSize());
return robot.createScreenCapture(bounds);
}
这对我有用:
试试这个:
public Pngs(){ // constructor
setBackground(new Color(0,0,0,0));
setUndecorated(true);
setOpacity(0.5F);
}
这会使您的 Jframe 透明和关闭选项不可见。所以,添加一个退出按钮来关闭你的框架。
有关不透明度和使 JFrame 透明的更多信息,请参阅 THIS
很抱歉,我知道有很多这样的问题,但我就是找不到解决方案。我尝试了不同的方法,但就是无法使背景透明。这是我的测试代码:
public class Pngs extends JPanel {
public void paint(Graphics g) {
Image img = createImage();
g.drawImage(img, 0, 0, this);
}
public static BufferedImage getScreenShot(
Component component) {
BufferedImage image = new BufferedImage(
component.getWidth(),
component.getHeight(),
BufferedImage.TYPE_INT_RGB
);
// call the Component's paint method, using
// the Graphics object of the image.
component.paint(image.getGraphics());
return image;
}
private static Image createImage() {
BufferedImage img = null;
try {
img = ImageIO.read(new File("oneImg.png"));
} catch (IOException e) {
}
return img;
}
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.getContentPane().add(new Pngs());
frame.setUndecorated(true);
frame.getContentPane().setBackground(new Color(1.0f, 1.0f, 1.0f, 0.5f));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(512, 512);
frame.setVisible(true);
try { //saves the image
// retrieve image
BufferedImage bi = getScreenShot(frame.getContentPane());
File outputfile = new File("saved.png");
ImageIO.write(bi, "png", outputfile);
} catch (IOException e) {
}
}
}
我尝试将 Color 构造函数的第 4 个参数设置为 0,这样它将完全透明,但我只得到黑色背景。另外,当它设置为 0.5f 时,它根本不透明。
可能是什么问题?
使用 BufferedImage.TYPE_INT_ARGB
而不是 BufferedImage.TYPE_INT_RGB
。
顺便说一句:使用此代码创建正确的屏幕截图:
public static BufferedImage getScreenShot(Component component) throws AWTException {
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice gd = ge.getDefaultScreenDevice();
Robot robot = new Robot(gd);
Rectangle bounds = new Rectangle(component.getLocationOnScreen(), component.getSize());
return robot.createScreenCapture(bounds);
}
这对我有用: 试试这个:
public Pngs(){ // constructor
setBackground(new Color(0,0,0,0));
setUndecorated(true);
setOpacity(0.5F);
}
这会使您的 Jframe 透明和关闭选项不可见。所以,添加一个退出按钮来关闭你的框架。 有关不透明度和使 JFrame 透明的更多信息,请参阅 THIS