Изменение размера снимка экрана, чтобы поместиться в прямоугольник - PullRequest
0 голосов
/ 04 февраля 2020

У меня проблемы с изменением размера снимка экрана, снятого роботом, в прямоугольник, обозначенный как "экран". Я хочу, чтобы все изображение было изменено в соответствии с этим прямоугольником. Тем не менее, он отображает только угол этого изображения.

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

}

Если есть что-то, что помогает мне решить эту проблему, или что-то, что делает этот код более эффективным Не бойтесь комментировать. Спасибо за помощь!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...