代码之家  ›  专栏  ›  技术社区  ›  Arno C

BuffereImage会导致MacOs上的程序冻结,但不会导致Windows上的程序冻结

  •  0
  • Arno C  · 技术社区  · 7 年前

    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);
    

    调试器不转到BuffereImage构造函数,而是转到GLFWKeyCallbackI。callback(),然后返回GLFWCursorEnterCallbackI。回调()。在此之后,它完全停止。

    在我的主类中,首先是生成缓冲图像的其余代码:

    BufferedImage imageIn = new BufferedImage(100,100,BufferedImage.TYPE_INT_RGB);
    


    我不确定我还能尝试什么,我看到了2005年到今天的其他一些帖子,问了类似的Mac问题,但没有答案。

    1 回复  |  直到 7 年前
        1
  •  2
  •   Arno C    7 年前

    我深入研究了一下,发现了这个问题。如评论中所述 here 如果我提供这个虚拟机选项“-Djava.awt.headless=true”,似乎可以解决这个问题。