Używam modułu perla Gtk2::WebKit
, aby utworzyć przeglądarkę i zrobić zrzut ekranu ze strony internetowej. Nie ma problemu z zrobieniem zrzutu ekranu widocznej części strony (rozmiar okna). Jak jednak zrobić zrzut ekranu całej strony, nawet tej części, która nie jest widoczna w oknie?perl Gtk2 :: WebKit: jak zrobić zrzut ekranu na pełną stronę
Odpowiedz
Myślę, że this jest tym, czego szukasz. Znalazłem go na Githubie.
screenshot.pl - zrzut ekranu
zapisać stronę jako SVG:
screenshot.pl --type svg http://www.google.com/
zapisać stronę jako PDF:
screenshot.pl --output cpan.pdf http://search.cpan.org/
zapisać element strona pobrana z zapytania XPath jako PNG:
screenshot.pl --output ba.png --xpath 'id("content")' http://bratislava.pm.org/
Oto moja GTK2 rozwiązanie tego problemu:
#!/usr/bin/perl
use Gtk2 -init;
use Gtk2::WebKit;
use Data::Dumper;
my $window = Gtk2::Window->new;
my $sw = Gtk2::ScrolledWindow->new;
my $view = Gtk2::WebKit::WebView->new;
my $factor = 0;
$window->set_default_size(Gtk2::Gdk->screen_width, Gtk2::Gdk->screen_height);
$window->set_border_width(1);
$sw->add($view);
$window->add($sw);
$window ->signal_connect('destroy' => \&delete_event);
$view->signal_connect('load-finished' => \&prepare_zoom);
$view->set_full_content_zoom(TRUE);
$view->signal_connect('size-allocate' => \&screenshot);
$view->open('http://stackoverflow.com/questions');
$window->show_all;
Gtk2->main;
#####################################
sub delete_event {
Gtk2->main_quit;
return FALSE;
}
#####################################
sub prepare_zoom {
$adj = $sw->get_vadjustment();
$factor = $adj->page_size/$adj->upper;
$view->set_zoom_level($factor);
}
sub screenshot {
return unless defined($window->window) && $factor>0;
my ($width, $height) = $window->window->get_size;
my $sWidth=$width*$factor;
my $gdkpixbuf = Gtk2::Gdk::Pixbuf->new ('rgb', 0, 8, $width, $height);
$gdkpixbuf->get_from_drawable($window->window,
undef, 0, 0, 0, 0, $width, $height);
$gdkpixbuf->save ("screenshot.jpg", 'jpeg', quality => 100);
#Gtk2->main_quit;
return FALSE;
}
Ten kod działa, ale nie jestem GTK2/Webkit ekspertem, więc jestem pewien, że to może być napisany w sposób lepszy sposób.
Ideą tego jest prosty:
- załadować stronę
- Pobierz pełny rozmiar strony i widoczny rozmiar strony, a następnie obliczyć współczynnik skali, aby zobaczyć pełną zawartość strony
- dopasowuje strony wykorzystujące ten współczynnik skali
- chwycić screenshot
UWAGI
- Zależy gdzie chcesz go zastosować, obliczenie współczynnika skalowania mogą wymagać pewnych korekt
- Można przyciąć zrzut ekranu (aby usunąć puste obszary) doprowadzenie wartości przekazywane do get_from_drawable.
Sprytna sztuczka, ale nie mogę jej użyć, ponieważ potrzebuję obrazu w oryginalnym rozmiarze. – Julien
Możesz użyć xvfb (http://en.wikipedia.org/wiki/Xvfb), aby to zrobić. Zasadniczo obliczyć wymiary docelowej sieci, wywołać xvfb z takimi wymiarami i załadować stronę w nim. –
używa GTK3, a nie GTk2. Nie mogę zainstalować Gtk3 na CentOS 6.5 – Julien
Dlaczego nie na 6.5? Sprawdź to: http://linuxfonts.narod.ru/compiling-and-installing-gtk3-in-centos6.html –