【问题标题】:Java: Taking screenshots and making image with separate threadsJava:截屏并使用单独的线程制作图像
【发布时间】:2014-08-02 04:24:19
【问题描述】:

我正在尝试以一种方法使用 Robot 截取屏幕截图,然后使用另一种方法尝试编写 Robot 生成的 BufferedImage,而不会中断 Robot 截取屏幕截图。到目前为止,我想出了这些:

屏幕截图生成:

public static void startRecord2() {
    Thread recordThread = new Thread() {
        //BufferedImage[] img;
        @Override
        public void run() {
            //int vector_index =  -1 , 
            int phase_counter=0;
            Robot rt;
            BufferedImage[] img = null;
            try {
                rt = new Robot();
                record = true;
                int buffer_index = 0; 
                //boolean newCreatorStarted = false;
                long very_start = System.currentTimeMillis(), phase_start = 0, phase_end = 0;
                while (record) { //(cnt == 0 || record) {
                    if(buffer_index==0){
                        img = new BufferedImage[max_limit];
                        phase_start = System.currentTimeMillis();
                        phase_counter++;
                    }
                    //System.out.println("total_frame_created = "+total_frame_created);
                    img[ buffer_index++ ] = rt.createScreenCapture(new Rectangle(screenWidth,screenHeight));
                    total_frame_created++;
                    //ImageIO.write(img, "jpeg", new File("./"+store+"/"+ System.currentTimeMillis() + ".jpeg"));
                    if(buffer_index==max_limit||!record) {
                        buffer_index=0;
                        CreateImage(img, phase_counter);
                        img = null;
                        System.gc();
                        phase_end = System.currentTimeMillis();

                        System.out.println("Time taken in phase #"+phase_counter+" = "+ String.valueOf((phase_end-phase_start)/1000.0));
                    }
                }
                long very_end = System.currentTimeMillis();
                System.out.println("Time taken to capture "+total_frame_created+" shots = "+ (very_end-very_start)/1000 );
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    };
    recordThread.start();
}

图像写作:

public static void CreateImage(BufferedImage[] img, int phase){//, Thread capturerThread) {
    Thread imageCreatorThread = new Thread(){
        @Override
        public void run(){
            int index = 0;

            while(index<max_limit){
                try {
                    if(img[index]!=null) {
                        ImageIO.write(img[index++ ], "png", new File("./"+store+"/"+phase+"_"+index+".png"));
                        img[index-1]=null;
                    }else{
                        index-=1;
                        break;
                    }
                } catch (IOException ex) {
                    Logger.getLogger(Recorder.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
            System.gc();
            System.err.println("\t\t\tWritten "+index+" images to disk");
            total_image_created+=index;
        }
    };
    imageCreatorThread.start();
}

我在这里做的是- 当一些帧(试图用值为 30 的 max_limit 来表示它)时,record 方法调用 ImageCreator 方法,该方法启动另一个线程来处理它通过参数获得的 BufferedImages。另外,我想保持记录器方法继续运行以连续(或在一段时间后)截取屏幕截图。但问题是,总是在捕获 60 帧左右(有时发现 61 帧)之后,Robot 会发生内存错误:

线程“Thread-1”java.lang.OutOfMemoryError 中的异常:Java 堆空间 在 sun.awt.windows.WRobotPeer.getRGBPixels(WRobotPeer.java:64) 在 java.awt.Robot.createScreenCapture(Robot.java:444) 在 Recorder$2.run(Recorder.java:124) 将 60 张图像写入磁盘

我尝试将堆内存更改为 512m、1024m。我还尝试使 startRecord2 方法中使用的 BufferedImage 数组为 null 并调用垃圾收集器(不知道它是否可以工作)。没有任何效果。我可以做些什么来建立我的算法?

提前致谢。

【问题讨论】:

    标签: java screenshot awtrobot


    【解决方案1】:

    看起来在您自己的代码中 GC 没有正常发生。
    在解决问题之前,您必须找出导致内存泄漏的罪魁祸首。
    增加堆大小不会解决您的问题,因为它肯定存在内存泄漏问题。
    您可以使用以下任何一种工具来找出内存泄漏问题。

    1) JAVA监视器
    2) Jconsole
    2)visualvm等

    【讨论】:

      猜你喜欢
      • 2011-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-04
      • 1970-01-01
      • 2012-12-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多