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”,它似乎可以解决问题。