This may be useful for placing text on maps, or identifying people in photos, etc. I know Gimp does that, but this is easier for quick jobs. It saves a screenshot when desired.
#!/usr/bin/perl use warnings; use strict; use Gtk2 '-init'; use Gnome2::Canvas; use Glib qw/TRUE FALSE/; my $file = shift or die "Need an image file $!\n"; #draggable text to add my @text =(['foobar',20,20,'Arial Bold 60','yellow'], ['foobaz',20,100,'monospace Bold 14','green'], ['goobar',20,150,'Sans Bold 24','pink'], ); my ( $dragging, $last_x, $last_y ); # item_move globals my $window = Gtk2::Window->new(); $window->set_title('Text Dragging'); # you may want to make this smaller for small photos $window->set_size_request(350,250); $window->signal_connect('destroy'=>\&delete_event ); my $vbox= Gtk2::VBox->new(FALSE, 1 ); $window->add($vbox); my $scroller = Gtk2::ScrolledWindow->new(); my $canvas = Gnome2::Canvas->new_aa(); $scroller->add($canvas); my $hbox= Gtk2::HBox->new(TRUE, 1 ); $vbox->pack_start($hbox,TRUE,TRUE,0); $hbox->set_border_width(2); $hbox->add($scroller); $vbox->pack_start(Gtk2::HSeparator->new, FALSE, FALSE, 0); my $hbox1= Gtk2::HBox->new(FALSE, 1 ); $vbox->pack_end($hbox1,FALSE,FALSE,0); $hbox1->set_border_width(2); my $button1 = Gtk2::Button->new('Screenshot Window'); $hbox1->pack_start( $button1, FALSE, FALSE, 0 ); $button1->signal_connect( clicked => \&screenshot ); my $label_w_markup = Gtk2::Label->new(); $label_w_markup->set_markup( "<span foreground= 'black' size ='15000'><i>Resize to desired size\n before screenshot</i></sp +an>"); $hbox1->pack_end( $label_w_markup, FALSE, FALSE, 0 ); my $root = $canvas->root; my $im = Gtk2::Gdk::Pixbuf->new_from_file( $file ); my $image = Gnome2::Canvas::Item->new ($root, 'Gnome2::Canvas::Pixbuf', pixbuf => $im, x => 0, y => 0, width => $im->get_width, height => $im->get_height, anchor => 'nw', ); $canvas->set_scroll_region(0,0,$im->get_width,$im->get_height); $image->lower_to_bottom(); foreach my $t( @text ){ my ($text,$x,$y,$font,$color) = @$t; my $font_desc = Gtk2::Pango::FontDescription->from_string($font); my $layout = $canvas->create_pango_layout($text); $layout->set_font_description($font_desc); my $tgroup = Gnome2::Canvas::Item->new ($root, 'Gnome2::Canvas::Group' +, x => $x, y => $y); Gnome2::Canvas::Item->new($tgroup, 'Gnome2::Canvas::Text', text=> $text , font_desc=>$font_desc, anchor =>'nw', fill_color=> $color, x=>0, y=>0); $tgroup->raise_to_top(); $tgroup->signal_connect( "event", \&item_move ); } $window->show_all(); Gtk2->main(); ################################################ sub delete_event { Gtk2->main_quit; return FALSE; } ############################################# sub item_move { my ( $item, $event ) = @_; # print "$item $event->type\n"; if ( $event->type eq "button-press" ) { $item->raise_to_top(); $canvas->window->set_cursor( Gtk2::Gdk::Cursor->new('fleur') ) +; $last_x = $event->x; $last_y = $event->y; $dragging = 1; } elsif ( $event->type eq "motion-notify" ) { if ($dragging) { my $new_x = $event->x; my $new_y = $event->y; $item->move( $new_x - $last_x, $new_y - $last_y ); $last_x = $new_x; $last_y = $new_y; } } elsif ( $event->type eq "button-release" ) { $dragging = 0; $canvas->window->set_cursor (undef); } return 0; } ############################################################## sub get_filename{ my $dstr = sprintf q{%02d%s%d}, (split /\s+/,localtime)[2,1,4]; return $dstr.time.'.jpg'; } ##################################### sub screenshot{ #we are going to save the visible canvas window my ($width, $height) = $canvas->window->get_size; # create blank pixbuf to hold the image my $gdkpixbuf = Gtk2::Gdk::Pixbuf->new ('rgb', 0, 8, $width, $height); $gdkpixbuf->get_from_drawable ($canvas->window, undef, 0, 0, 0, 0, $width, $height); #only jpeg and png is supported !!!! it's 'jpeg', not 'jpg' $gdkpixbuf->save ( get_filename() , 'jpeg', quality => 100); return FALSE; } ##################################################### __END__
|
|---|