首页 > 解决方案 > 调整屏幕截图的大小以适合矩形

问题描述

我无法将机器人捕获的屏幕截图调整为指定为“屏幕”的矩形。我希望调整整个图像的大小以适合该矩形。但是,它只显示该图像的一角。

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

}

如果有什么可以帮助我解决这个问题,或者有什么可以让这段代码更高效,不要害怕发表评论。感谢所有的帮助!

标签: javaimagejavafx

解决方案


推荐阅读