【发布时间】: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