Automatyczny screengrabber i detektor zmian na ekranie

Czasem potrzebny jest program który zrobi zrzut ekranu automatycznie, bez zadawania zbędnych pytań i czekania na cokolwiek, zupełnie bez interakcji z użytkownikiem.

Takim programem jest xwd, ale ma on swoje wady, po pierwsze robi tylko zrzuty okien albo całego ekranu , po drugie nie działa pod windows.
Pierwsze da się jakoś wytrzymać bo potrzebną część obrazu można wyciąć sobie później, najlepiej od razu podczas zmiany formatu pliku na jakiś bardziej użyteczny, bo xwd zrzuca w zasadzie surowe dane z pamięci ekranu.

Niestety półgodzinne poszukiwania odpowiednika xwd pod windows nie przyniosły rezultatu. Wszystkie programy pod windows jakie udało się znaleźć do działania wymagały kliknięcia czegoś albo naciśnięcia jakiegoś przycisku.

Dlatego aby nie tracić więcej czasu na szukanie poświęciłem 5 minut na napisanie własnego screengrabbera, który robi dokładnie to czego wxd nie potrafi, czyli:
  • zapisuje określony obszar lub cały ekran
  • obsługuje popularne formaty plików jak png jpeg ppm xpm bmp
  • jest wieloplatformowy (do uruchomienia pod windows wymagania takie same jak tutaj)

Przy okazji pisania skryptu do robienia zrzutów ekranu napisałem też detektor zmian na ekranie - skrypt który czeka aż kolor piksela w określonym miejscu ekranu ulegnie zmianie. Jak się doczeka to kończy swoje działanie.

Można go więc wykorzystać tak jak sleep albo jak oczekiwanie na naciśniecie klawisza.
Przy monitorowaniu zachowania jakiegoś wolno działającego programu, można odpalić oba skrypty w pętli, na zasadzie zrób zrzut ekranu i czekaj aż coś się zmieni aby zrobić następny zrzut i potem znowu czekaj na zmiany.
Na tym zastosowania się nie kończą, może sobie poczekać na pojawienie się lub zniknięcie jakiegoś okienka albo komunikatu aby potem odegrać jakiś dźwięk. W ten sposób nie trzeba się gapić w monitor aby zauważyć zmiany, wystarczy pozostawać w zasięgu słuchu.

Można się też pobawić i zmierzyć jaki skrypt ma refleks, idziemy na stronę z grą wydajemy polecenie:
sleep 7; sleep_until_change.py 410 390 0; xte "mouseclick 1"
a potem ustawiamy kursor w odpowiedniej pozycji.

Wyszło mi, że czas reakcji skryptu, połączony z czasem potrzebnym na kliknięcie to 6 milisekund (uwaga: pozycja światełek zależy od przeglądarki, rodzaju posiadanych okienek i rozdzielczości więc liczby takie jak u mnie nie zawsze będą pasować).

Brak komentarzy:

Prześlij komentarz