1

私は以下によって撮影されたスクリーンショットをスケーリングしようとしています:

robot.createScreenCapture(SCREEN_RECT);

私は 600X400 であり、600X400 である JFrame に収まる画像に取り込もうとしています。私のプログラムは、swing ワーカーを使用して、各画像またはフレームからビデオを作成しています。フレームには、それぞれ 200 ミリ秒の遅延があります。再スケーリングするように指示された画像は、元の画像を元の寸法で表示するだけです。誰かがこれを修正する方法を知っていますか、それともサイズ変更をあきらめるべきですか?

@SuppressWarnings("serial")
public class temporaryShit extends JPanel 
{
    private static final int width = 600;
    private static final int height = 400;
    private JLabel displayedLabel = new JLabel();

    public temporaryShit() 
    {
        setLayout(new BorderLayout());
        add(displayedLabel);
        try {
            MySwingWorker mySwingWorker = new MySwingWorker();
            mySwingWorker.execute();
        } catch (AWTException e) {
        }
    }

    public void setLabelIcon(Icon icon) {
        displayedLabel.setIcon(icon);
    }

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(width, height);
    }

    private class MySwingWorker extends SwingWorker<Void, Icon> 
    {
        private final Rectangle SCREEN_RECT = new Rectangle(0, 0, width, height);
        private long delay = 200;
        private Robot robot = null;

        public MySwingWorker() throws AWTException 
        {
            robot = new Robot();
        }

        @Override
        protected Void doInBackground() throws Exception 
        {
            Timer utilTimer = new Timer();
            TimerTask task = new TimerTask() 
            {
                @Override
                public void run() 
                {
                    BufferedImage capturedImage = captureScreen();
                    publish(new ImageIcon(capturedImage));
                }
            };
            utilTimer.scheduleAtFixedRate(task, delay, delay);
            return null;
        }

        @Override
        protected void process(List<Icon> chunks) 
        {
            for (Icon icon : chunks) 
            {
                setLabelIcon(icon);
            }
        }

        private BufferedImage captureScreen() 
        {
            BufferedImage img = robot.createScreenCapture(SCREEN_RECT);
            return createResizedImage(img, width, height);
        }

        public BufferedImage createResizedImage(Image original, int width, int height) 
        {
            BufferedImage scaledBI = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
            Graphics2D g = scaledBI.createGraphics();
            g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
            g.drawImage(original, 0, 0, width, height, null);
            g.dispose();
            return scaledBI;
        }
    }

    private static void createAndShowGui() 
    {
        temporaryShit mainPanel = new temporaryShit();

        JFrame frame = new JFrame("SwingWorker Eg");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(mainPanel);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    public static void main(String[] args) 
    {
        SwingUtilities.invokeLater(new Runnable() 
        {
            public void run() 
            {
                createAndShowGui();
            }
        });
    }
}
4

2 に答える 2