3

自分の画面よりも大きい Web サイト全体のスクリーン ショットを一度に撮りたいです。Robot クラスを使用して可視領域のスクリーンショットを撮る方法を知っています。私が考えたこれを行う1つの方法は次のとおりです。

  1. ブラウザを起動し、目的の Web サイトに移動します
  2. プログラムを開始
  3. プログラムは可視領域のスクリーンショットを撮ります
  4. プログラムは下にスクロールしてページの後半を表示し、スクリーンショットを撮ります
  5. 両方のスクリーンショットが結合されます

これはやや不器用な解決策であり、現時点では (Web ブラウザーのウィンドウをスクロールするために) それが可能かどうかさえわかりません。だから私はより良い解決策のヒントを探しています。

編集 1: これは、元の投稿で思い描いていたものです。フローは(プロトタイプ)です:

  1. ブラウザーを開き、モニター 1 で目的の Web サイトに移動します。
  2. モニター 2 で、プログラムを実行します (私の場合はネット Bean から)
  3. プログラムは最初のスクリーンショットをキャプチャしますが、Robot.mouseScroll が呼び出された場合、スクロールするのは Web ブラウザではなく NetBeans ウィンドウです。
  4. ブラウザー画面をスクロールするには、マウスのモニター 1 を動かし、クリックしてフォーカスを取得し、スクロールしてから、別のスクリーンショットを撮ります。これで、ステッチできる 2 つの png 画像ができました。

問題は、技術的にはこれを行うことはできますが、プログラムを介してマウスを動かしているため、コンピューターで同時に他のことを行うことができないことです。目標は、Excel で作業しながら、プログラムでスクリーンショットを取得し、同時に画像を分析する (情報をステッチして抽出する) ことです。現在の設定では、それは不可能です。

さらに、Java ではこれがまったくできないように見え始めています。興味深いことに、JavaScript でできる可能性があり、Win Api を使用した C++ でできるようです。これは残念です。何か考えはありますか?

/** * @param args the command line arguments */ public static void main(String[] args) throws IOException { int width; int height;

    try{
        // Get screen devices.
        GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
        GraphicsDevice[] gdevices = ge.getScreenDevices();

        // Find out widht and height of each, print line.
        for (int i = 0; i < gdevices.length; i++){
            System.out.println("Device " + i);
            System.out.println("Width:" + gdevices[i].getDisplayMode().getWidth());
            System.out.println("Height:" + gdevices[i].getDisplayMode().getHeight());
        }

        // Get width and height again for later. Don't worry about this now.
        width = gdevices[1].getDisplayMode().getWidth();
        height = gdevices[1].getDisplayMode().getHeight();

        // Initiate robot.
        Robot robot = new Robot(gdevices[1]);
        // Size of printscreen area. Temporary. Will be entire screen later.
        Rectangle captureSize = new Rectangle(0,0,500,500);

        // Take screenshot on gdevice[1]
        BufferedImage bufferedImage = robot.createScreenCapture(captureSize);
        File outputfile = new File("My Screenshot" + 1 + ".png");
        boolean write = ImageIO.write(bufferedImage, "png",outputfile);

        // Preparing to take another screenshot after.
        /* Need to move mouse to monitor where screenshot is taken. Mouse
         * is currently at a monitor that displays NetBeans, which is where 
         * I'm running this from, for now.
         */

        robot.mouseMove(200,200);
        /* Need to activate window by gaining focus, don't how to do with robot
         * do with mouse instead.
         */
        robot.mousePress(InputEvent.BUTTON1_MASK);
        robot.mouseRelease(InputEvent.BUTTON1_MASK);
        /* After the first screen shot, scroll screen that's now 
         * active (focused?)
         */
        robot.mouseWheel(3);

        // Take second screenshot.
        robot.delay(1000);
        bufferedImage = robot.createScreenCapture(captureSize);
        outputfile = new File("My Screenshot" + 2 + ".png");
        //write into second half
        write = ImageIO.write(bufferedImage, "png",outputfile);
    }
    catch (AWTException e){
        System.err.println("Somethingfishy is going on ...");
    }
}

}

編集 2: 新しいアプローチ OK、これをよく考えてみてください。たとえ、移動の代わりに alt+tab を使用するなど、フォーカスを見つけたとしても、Excel で同時に作業する必要があるため、役に立ちません。「仮想モニター」のアイデアに関する別の質問を開始します。お二方、アイデア提供ありがとうございました。

4

4 に答える 4

1

ページは でレンダリングされJEditorPaneますか? ComponentImageCaptureその場合は、クラスを参照してください。

于 2012-08-12T03:12:03.837 に答える
0

質問自体の私の編集を参照してください。プログラムのフローは、仮想モニターなどにリダイレクトする必要があります。ありがとう。

于 2012-08-12T11:27:21.363 に答える
0

試す

      Dimension size = driver.manage().window().getSize();
      Point point = driver.manage().window().getPosition();
      Robot robot = new Robot();
      String format = "png";
      File tempFile = new File(System.getProperty("user.dir") + "//" + screenshotFolder + "//" + fileName);
      Rectangle captureRect = new Rectangle(point.getX(), point.getY(), size.getWidth(), size.getHeight());
      BufferedImage captureImage = robot.createScreenCapture(captureRect);
      ImageIO.write(captureImage, format, tempFile);
于 2015-06-11T11:15:30.583 に答える
0

ロボット クラスは、概説したとおりに使用できますが、スクロールのクリックと 2 番目のスクリーン ショットの間に遅延を含めるようにしてください。これはロボットの素晴らしいアプリケーションです。コードを入手したら、ここにコードを投稿する必要があります。画面にないものを画面キャプチャする方法はないと思います。ビデオ カードとディスプレイの解像度によって制限されます。

于 2012-08-12T02:28:46.900 に答える