2

1秒あたり25枚のスクリーンショットを撮り、ユーザー定義の場所に保存するGUIベースのJavaプログラムを作成しました。
2つの問題があることを除いて、かなりうまく機能します。

  • 画像にマウスカーソルがありません。これは、画像にBufferedImageカーソル情報が含まれていないためです。プログラムで追加する必要があります。

  • スクリーンショットを撮るスレッドはデーモンスレッドです。そのため、アプリケーションを閉じると、スレッドが強制終了され、書き込まれていたPNGイメージが破損します。それは避けたい。

  • これが私のアプリケーションの画像です:
    受賞歴のある直感的なGUI
    ここに画像の説明を入力してください

    キャプチャされた高精細画像は次のようになります
    ここに画像の説明を入力してください
    。画像からわかるように、カーソル情報はMouseInfoの静的メソッドを使用してコンソールに表示されています。


    上記の2つの問題を解決する方法を教えてください。
    問題を解決すると、画像は次のようになります。
    カーソル付き

    4

    1 に答える 1

    2

    画像にマウスカーソルがありません。BufferedImagesにカーソル情報が含まれていないためです。プログラムで追加する必要があります。

    そうです、後でカーソルを追加する必要があります。これは、Robotクラスで撮影したスクリーンショットにカーソルが含まれていないためです。「BufferedImageにマウス情報が含まれていない」からではありません。BufferedImageは、ピクセルのラスターを含むクラスです。

    スクリーンショットを撮るスレッドはデーモンスレッドです。そのため、アプリケーションを閉じると、スレッドが強制終了され、書き込まれていたPNGイメージが破損します。それは避けたい。

    単純に、スクリーンショットスレッドで、続行するかどうかを示すフラグを使用します。そのブール値がtrueに設定されている限り、スクリーンショットを撮り続けます。必ず非デーモンにします。したがって、アプリケーションを閉じるときは、フラグをfalseに設定してください。おそらくこれを行う最も簡単な方法は、WindowListenerを追加することです。

    yourFrame.addWindowListener(new WindowAdapter()
    {
        public void windowClosed(WindowEvent e)
        {
            screenshotThread.stopTakingScreenshots(); // This methods set the flag
        }
    }
    

    また、スクリーンショットを作成して保存するのにかかる時間を取っていないことに注意してください。40ミリ秒の固定スリープを使用しますが、スクリーンショットを撮って保存するのに4ミリ秒かかるとすると、36ミリ秒だけスリープする必要があります。スクリーンショットの作成にかかる時間を計るには、メソッドSystem.currentTimeMillis();の前後を使用takeShot()して違いを生みます。

    于 2012-09-11T18:09:04.477 に答える