gpt4 book ai didi

java - 创建一个线程来重复捕获屏幕

转载 作者:行者123 更新时间:2023-12-02 00:05:19 24 4
gpt4 key购买 nike

package demo;
import java.awt.*;
import java.awt.image.*;
import java.util.*;
import javax.swing.*;

public class ScreenCapturingThread extends Thread{
public ScreenCapturingThread(Vector<BufferedImage> screenShots,
int frameRate,
Icon cursor,
Rectangle recordingArea){
this.screenShots = screenShots;
this.frameRate = frameRate;
this.cursor = cursor;
this.recordingArea = recordingArea;

try{
bot = new Robot();
}catch(Exception e){
System.out.println(e);
}
calculateSleepTime();
}
@Override
public void run(){
while(keepCapturing == true){
try{
screenShots.add(takeScreenShot());
sleep(sleepTime);

keepCapturing = false; //take only one shot

System.out.println("here");
JFrame frame = new JFrame();
frame.setSize(recordingArea.width,recordingArea.height);
frame.getGraphics().drawImage(screenShots.firstElement(), 0, 0,frame);
frame.repaint();
frame.setVisible(true);

}catch(InterruptedException e){
e.printStackTrace();
}
}
}
public BufferedImage takeScreenShot(){
p = m.getPointerInfo();
Point location = p.getLocation();
image = bot.createScreenCapture(recordingArea);
if(cursor!=null){
Graphics g = image.getGraphics();
g.drawImage(((ImageIcon)cursor).getImage(), location.x,location.y,null);
}

return image;
}
public void stopIt(){
keepCapturing = false;
}
public void calculateSleepTime(){
sleepTime = 1/frameRate;
}

public static void main(String[] args) {
Vector<BufferedImage> bufferedImages = new Vector<>(100);
int frameRate = 10;
Icon cursor = (Icon) new ImageIcon("src/images/blackCursor.png");
Rectangle r = new Rectangle(1280,800);
ScreenCapturingThread sc = new ScreenCapturingThread(bufferedImages,frameRate,cursor,r);

sc.start();
}
Vector<BufferedImage> screenShots;
int frameRate;
long sleepTime;
boolean keepCapturing = true;
Icon cursor;
Rectangle recordingArea;
Robot bot;
MouseInfo m;
PointerInfo p;
BufferedImage image;
}

说明

我设计了与我的屏幕录像机配合使用的线程,但我决定先测试它。这就是它应该做的:

  • 通过传递适当的参数创建一个新的线程对象
  • 拍摄仅一个屏幕截图(仅在此测试期间),将其存储在 vector 中,并在 run() 结束之前,将其绘制在 JFrame 上,以便我可以查看已捕获的内容。
  • 问题

    我不断收到 NullPointerException

    frame.getGraphics().drawImage(screenShots.firstElement(), 0, 0,frame);

    我不知道出了什么问题。
    如果可以请找出错误吗?

    更新:

    enter image description here现在,虽然 NullPointerException 消失了,但框架却是空白的,而它不应该是空白的

    为什么?

    最佳答案

    JFrame 在显示之前不会为您提供任何图形

    如果您想在显示 JFrame 之前进行绘制,您永远不应该这样做:

    frame.pack();
    frame.setSize(recordingArea.width, recordingArea.height);
    Graphics g = frame.getContentPane().getGraphics();
    g.drawImage(screenShots.firstElement(), 0, 0, frame);

    因为如Andrew Thompson has correctly written :

    Do not use Component.getGraphics(). Instead, subclass and override the paint() (AWT), or paintComponent() (Swing) method.

    Component.getGraphics() simply can't work. Java uses a callback mechanism for drawing graphics. You are not supposed to "push" graphics information into a component using getGraphics(). Instead you are supposed to wait until Java calls your paint()/paintComponent() method. At that moment you are supposed to provide the Component with the drawings you would like to do.

    相反,你最好这样做:

    BufferedImage img = new BufferedImage(recordingArea.width, recordingArea.height,
    BufferedImage.TYPE_3BYTE_BGR);
    Graphics g = img.createGraphics();
    g.drawImage(screenShots.firstElement(), 0, 0, frame);
    JLabel l = new JLabel(new ImageIcon(img));
    frame.getContentPane().add(l);

    关于java - 创建一个线程来重复捕获屏幕,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14014588/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com