BufferedImage 导致程序在 MacOs 上冻结,但在 Windows 上没有
BufferedImage causes a program freeze on MacOs but not on Windows
我正在使用 piece of code 获取我的小组项目应用程序屏幕的 屏幕截图 。在我的 Macbook Pro 上,代码冻结了屏幕,而在我队友的 PC(所有 Windows)上它运行得很好,并在他们的根目录中导出一个 .png 文件。
密码
public void screenShot(){
//Creating an rbg array of total pixels
int[] pixels = new int[WIDTH * HEIGHT];
int bindex;
// allocate space for RBG pixels
ByteBuffer fb = ByteBuffer.allocateDirect(WIDTH * HEIGHT * 3);
// grab a copy of the current frame contents as RGB
glReadPixels(0, 0, WIDTH, HEIGHT, GL_RGB, GL_UNSIGNED_BYTE, fb);
// convert RGB data in ByteBuffer to integer array
for (int i=0; i < pixels.length; i++) {
bindex = i * 3;
pixels[i] =
((fb.get(bindex) << 16)) +
((fb.get(bindex+1) << 8)) +
((fb.get(bindex+2) << 0));
}
//Allocate colored pixel to buffered Image
BufferedImage imageIn = null;
try{
//THIS LINE
imageIn = new BufferedImage(WIDTH, HEIGHT,BufferedImage.TYPE_INT_RGB);
//THIS LINE ^^^^^
imageIn.setRGB(0, 0, WIDTH, HEIGHT, pixels, 0 , WIDTH);
} catch (Exception e) {
e.printStackTrace();
}
问题
在调试时我可以看到在这一行介入时
imageIn = new BufferedImage(WIDTH, HEIGHT,BufferedImage.TYPE_INT_RGB);
调试器不会转到 BufferedImage 构造函数,而是转到 GLFWKeyCallbackI.callback(),然后再转到 GLFWCursorEnterCallbackI.callback()。在此之后它完全停止了。
我试过的
在我的主要 class 中,所有其余代码都是这样制作缓冲图像的:
BufferedImage imageIn = new BufferedImage(100,100,BufferedImage.TYPE_INT_RGB);
它也冻结了模拟,但它似乎确实执行了该行。
我不确定我还能尝试什么,我看到其他一些帖子从 2005 年到今天问了类似的 Mac 问题但没有答案。
我深入研究并发现了这个问题。如评论 here 中所述,如果我提供此 VM 选项“-Djava.awt.headless=true”,它似乎可以解决问题。
我正在使用 piece of code 获取我的小组项目应用程序屏幕的 屏幕截图 。在我的 Macbook Pro 上,代码冻结了屏幕,而在我队友的 PC(所有 Windows)上它运行得很好,并在他们的根目录中导出一个 .png 文件。
密码
public void screenShot(){
//Creating an rbg array of total pixels
int[] pixels = new int[WIDTH * HEIGHT];
int bindex;
// allocate space for RBG pixels
ByteBuffer fb = ByteBuffer.allocateDirect(WIDTH * HEIGHT * 3);
// grab a copy of the current frame contents as RGB
glReadPixels(0, 0, WIDTH, HEIGHT, GL_RGB, GL_UNSIGNED_BYTE, fb);
// convert RGB data in ByteBuffer to integer array
for (int i=0; i < pixels.length; i++) {
bindex = i * 3;
pixels[i] =
((fb.get(bindex) << 16)) +
((fb.get(bindex+1) << 8)) +
((fb.get(bindex+2) << 0));
}
//Allocate colored pixel to buffered Image
BufferedImage imageIn = null;
try{
//THIS LINE
imageIn = new BufferedImage(WIDTH, HEIGHT,BufferedImage.TYPE_INT_RGB);
//THIS LINE ^^^^^
imageIn.setRGB(0, 0, WIDTH, HEIGHT, pixels, 0 , WIDTH);
} catch (Exception e) {
e.printStackTrace();
}
问题
在调试时我可以看到在这一行介入时
imageIn = new BufferedImage(WIDTH, HEIGHT,BufferedImage.TYPE_INT_RGB);
调试器不会转到 BufferedImage 构造函数,而是转到 GLFWKeyCallbackI.callback(),然后再转到 GLFWCursorEnterCallbackI.callback()。在此之后它完全停止了。
我试过的
在我的主要 class 中,所有其余代码都是这样制作缓冲图像的:
BufferedImage imageIn = new BufferedImage(100,100,BufferedImage.TYPE_INT_RGB);
它也冻结了模拟,但它似乎确实执行了该行。
我不确定我还能尝试什么,我看到其他一些帖子从 2005 年到今天问了类似的 Mac 问题但没有答案。
我深入研究并发现了这个问题。如评论 here 中所述,如果我提供此 VM 选项“-Djava.awt.headless=true”,它似乎可以解决问题。