无法创建 JFrame 的屏幕截图
Can't create a screenshot of a JFrame
我正在尝试使用 Java 截取屏幕截图,我有以下代码:
import java.awt.Rectangle;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
public class Visualizer {
public static final void makeScreenshot(JFrame argFrame) {
Rectangle rec = argFrame.getBounds();
BufferedImage bufferedImage = new BufferedImage(rec.width, rec.height,
BufferedImage.TYPE_INT_ARGB);
argFrame.paint(bufferedImage.getGraphics());
try {
// Create temp file.
File temp = File.createTempFile("screenshot", ".png");
// Use the ImageIO API to write the bufferedImage to a temporary file
ImageIO.write(bufferedImage, "png", temp);
// Delete temp file when program exits.
temp.deleteOnExit();
} catch (IOException ioe) {
} // catch
}
public static void main(String[] args) {
JFrame window = new JFrame();
makeScreenshot(window);
}
}
但抛出异常:
Exception in thread "main" java.lang.IllegalArgumentException: Width (0) and height (0) cannot be <= 0
来自 JFrame#getBounds()
(或者更确切地说,Component#getBounds()
)' API:
The bounds specify this component's width, height, and location relative to its parent.
相对于其父项关注:这可能意味着负值或0
。
反过来,用宽度/高度的负值初始化 BufferedImage
将抛出 IllegalArgumentException
。
问题是你的框架尺寸 return 0.when 你调用 rec.width()
.it returns 0 如果你调用 height.but 相同 height.but 13=] 那么矩形是正确的 values.actually 你的矩形是空矩形 .java.awt.Rectangle[x=0,y=0,width=0,height=0]
解决这个问题;
致电setVisible(true)
JFrame window = new JFrame();
window.setVisible(true);
makeScreenshot(window);
如果你打电话给
JFrame window = new JFrame();
window.pack();
makeScreenshot(window);
它也有效
我试过了,效果很好:
1) 从帧中获取图像
public static BufferedImage getFrameImage(JFrame argFrame){
int w = argFrame.getWidth();
int h = argFrame.getHeight();
BufferedImage bi = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
Graphics2D g = bi.createGraphics();
g.setColor(Color.white);
g.fillRect(0, 0, w, h);
argFrame.paint(g);
paint(g);
return bi;
}
2) 保存该图像:
public static final void makeScreenshot(JFrame argFrame) {
try {
// Create temp file.
File temp = File.createTempFile("screenshot", ".png");
// Use the ImageIO API to write the bufferedImage to a temporary file
ImageIO.write(getFrameImage(argFrame), "png", temp);
// Delete temp file when program exits.
temp.deleteOnExit();
} catch (IOException ioe) {
} // catch
}
但是看到你的代码,我没有看出什么问题。这可能是与 JFrame 相关的问题,JFrame 可能从未设置为可见,或者 pack(),也可能尚未定义高度和宽度。
最好在 JFrame 上放置一些 JLabel 或面板 window 以确保其大小不会为 0。
类似于:
public static void main(String[] args) {
JFrame window = new JFrame();
JPanel panel = new JPanel();
JLabel label = new JLabel("Hello Everyone!!");
panel.add(label);
window.add(panel);
window.setVisible(true);
window.pack();
makeScreenshot(window);
}
我正在尝试使用 Java 截取屏幕截图,我有以下代码:
import java.awt.Rectangle;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
public class Visualizer {
public static final void makeScreenshot(JFrame argFrame) {
Rectangle rec = argFrame.getBounds();
BufferedImage bufferedImage = new BufferedImage(rec.width, rec.height,
BufferedImage.TYPE_INT_ARGB);
argFrame.paint(bufferedImage.getGraphics());
try {
// Create temp file.
File temp = File.createTempFile("screenshot", ".png");
// Use the ImageIO API to write the bufferedImage to a temporary file
ImageIO.write(bufferedImage, "png", temp);
// Delete temp file when program exits.
temp.deleteOnExit();
} catch (IOException ioe) {
} // catch
}
public static void main(String[] args) {
JFrame window = new JFrame();
makeScreenshot(window);
}
}
但抛出异常:
Exception in thread "main" java.lang.IllegalArgumentException: Width (0) and height (0) cannot be <= 0
来自 JFrame#getBounds()
(或者更确切地说,Component#getBounds()
)' API:
The bounds specify this component's width, height, and location relative to its parent.
相对于其父项关注:这可能意味着负值或0
。
反过来,用宽度/高度的负值初始化 BufferedImage
将抛出 IllegalArgumentException
。
问题是你的框架尺寸 return 0.when 你调用 rec.width()
.it returns 0 如果你调用 height.but 相同 height.but 13=] 那么矩形是正确的 values.actually 你的矩形是空矩形 .java.awt.Rectangle[x=0,y=0,width=0,height=0]
解决这个问题;
致电setVisible(true)
JFrame window = new JFrame();
window.setVisible(true);
makeScreenshot(window);
如果你打电话给
JFrame window = new JFrame();
window.pack();
makeScreenshot(window);
它也有效
我试过了,效果很好:
1) 从帧中获取图像
public static BufferedImage getFrameImage(JFrame argFrame){
int w = argFrame.getWidth();
int h = argFrame.getHeight();
BufferedImage bi = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
Graphics2D g = bi.createGraphics();
g.setColor(Color.white);
g.fillRect(0, 0, w, h);
argFrame.paint(g);
paint(g);
return bi;
}
2) 保存该图像:
public static final void makeScreenshot(JFrame argFrame) {
try {
// Create temp file.
File temp = File.createTempFile("screenshot", ".png");
// Use the ImageIO API to write the bufferedImage to a temporary file
ImageIO.write(getFrameImage(argFrame), "png", temp);
// Delete temp file when program exits.
temp.deleteOnExit();
} catch (IOException ioe) {
} // catch
}
但是看到你的代码,我没有看出什么问题。这可能是与 JFrame 相关的问题,JFrame 可能从未设置为可见,或者 pack(),也可能尚未定义高度和宽度。
最好在 JFrame 上放置一些 JLabel 或面板 window 以确保其大小不会为 0。 类似于:
public static void main(String[] args) {
JFrame window = new JFrame();
JPanel panel = new JPanel();
JLabel label = new JLabel("Hello Everyone!!");
panel.add(label);
window.add(panel);
window.setVisible(true);
window.pack();
makeScreenshot(window);
}