У меня проблемы с изменением размера снимка экрана, снятого роботом, в прямоугольник, обозначенный как "экран". Я хочу, чтобы все изображение было изменено в соответствии с этим прямоугольником. Тем не менее, он отображает только угол этого изображения.
ScreenRecorder. java:
package sceenrecorder;
import java.awt.AWTException;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import java.awt.image.RenderedImage;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import javax.imageio.ImageIO;
import javax.imageio.stream.ImageOutputStream;
import javafx.application.Application;
import javafx.embed.swing.SwingFXUtils;
import javafx.event.Event;
import javafx.event.EventHandler;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.image.WritableImage;
import javafx.scene.layout.HBox;
import javafx.stage.Stage;
public class ScreenRecorder extends Application{
private Image image;
private BufferedImage capture;
private Robot bot;
private Rectangle screen;
private Group root;
private Scene scene;
private HBox hbox;
private ImageView view;
private File file = new File("C:\\Users\\Mneal5356\\Pictures\\Image.png");
private final double HEIGHT = 600, WIDTH = 600, BTNW = 100, BTNH = 20;
public static void main(String[] args) {
launch(args);
}
public void record() throws AWTException, FileNotFoundException {
bot = new Robot();
screen = new Rectangle(0,0,(int)(WIDTH),(int)(HEIGHT/1.5));
capture = resize(bot.createScreenCapture(screen), screen.getWidth(), screen.getHeight());
image = SwingFXUtils.toFXImage(capture, null);
view.setImage(image);
hbox = new HBox(view);
root.getChildren().add(hbox);
}
@SuppressWarnings("unchecked")
@Override
public void start(Stage stage) throws Exception {
bot = new Robot();
screen = new Rectangle(0,0,(int)(WIDTH),(int)(HEIGHT/1.5));
capture = resize(bot.createScreenCapture(screen), screen.getWidth(), screen.getHeight());
image = SwingFXUtils.toFXImage(capture, null);
stage.setHeight(HEIGHT);
stage.setWidth(WIDTH);
stage.setResizable(false);
root = new Group();
scene = new Scene(root);
view = new ImageView();
Button takeShot = new Button("Screenshot");
takeShot.setLayoutX(WIDTH/2 - BTNW/2);
takeShot.setLayoutY(450);
takeShot.setPrefSize(BTNW, BTNH);
takeShot.setOnAction(new EventHandler() {
@Override
public void handle(Event arg0) {
try {
try {
record();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (AWTException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
Button save = new Button("Save Image");
save.setLayoutX(WIDTH/2 - BTNW/2);
save.setLayoutY(500);
save.setPrefSize(BTNW, BTNH);
save.setOnAction(new EventHandler() {
@Override
public void handle(Event arg0) {
try {
ImageIO.write(SwingFXUtils.fromFXImage(image, null), "png", file);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
view = new ImageView();
view.setImage(image);
hbox = new HBox(view);
root.getChildren().add(hbox);
root.getChildren().add(takeShot);
root.getChildren().add(save);
stage.setScene(scene);
stage.show();
}
public BufferedImage resize(BufferedImage img, double width, double height) {
java.awt.Image tmp = img.getScaledInstance((int)width, (int)height, java.awt.Image.SCALE_SMOOTH);
BufferedImage dimg = new BufferedImage((int)width, (int)height, BufferedImage.TYPE_INT_ARGB);
Graphics2D g2d = dimg.createGraphics();
g2d.drawImage(tmp,0,0,null);
g2d.dispose();
return dimg;
}
}
Если есть что-то, что помогает мне решить эту проблему, или что-то, что делает этот код более эффективным Не бойтесь комментировать. Спасибо за помощь!