Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/perl
- # install the necessary perl libraries.
- # if you want to have plate number recognition, you need to install alpr.
- use utf8;
- use strict;
- use warnings;
- use FindBin;
- use File::Spec; # used to convert relative to absolute paths
- use Gtk2 '-init';
- use Gtk2::ImageView; # apt-get install libgtk2-imageview-perl
- #use Gtk2::Gdk;
- use Glib qw(TRUE FALSE);
- use JSON::PP qw(decode_json);
- use Data::Dumper;
- use File::Temp qw(tempdir);
- use File::Basename;
- @ARGV == 1 or die "too few arguments (should be one image)";
- my %presets = (
- " kein" => { strasse => "", hausnummer => "", vorwurf => "" },
- XYZStraße => {
- strasse => "XYZStraße",
- hausnummer => "45",
- vorwurf => "Parken auf dem Rad mit Behinderung. Ich musste absteigen und mein Fahrrad um das geparkte Auto schieben."
- },
- );
- my $template = '"Sehr geehrte Damen und Herren,\n\n' .
- 'ich erstatte Anzeige einer Verkehrsordnungswidrigkeit wegen:\n\n$state{vorwurf}\n\n' .
- 'Ort: $state{strasse}\nin Höhe: $state{hausnummer}\n\n' .
- 'Datum: $state{date}\nUhrzeit: $state{time}\n' .
- 'amtl. Kennzeichen: $state{kennzeichen}\nHersteller: $state{hersteller}\nFarbe: $state{farbe}\n\n' .
- 'Ich bitte Sie, den Halter des Fahrzeugs entsprechend zu ahnden.\n\n' .
- 'Zeuge: Vorname Nachname\nAnschrift: Irgendwasstraße 666, 2xxxx Hamburg\n\n' .
- 'Mit freundlichem Gruß,\nVorname Nachname"';
- my @monthNames = ("", "Januar", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember");
- my %state; # will hold fields like file-name, date/time, license plate number, name of location, ...
- # handle commandline argument
- $state{file} = $ARGV[0];
- $state{file} = File::Spec->rel2abs($state{file}) unless (File::Spec->file_name_is_absolute($state{file}));
- my $tmpdir = tempdir( CLEANUP => 1 );
- my $fname = basename($state{file});
- my $foobar = `exiftran -o $tmpdir/$fname -a $state{file}`;
- $state{file} = "$tmpdir/$fname";
- ($state{date}, $state{time}) = getDateTime();
- $state{kennzeichen} = getPlateNumber();
- my $window = Gtk2::Window->new();
- my $layout = Gtk2::Table->new(11, 3);
- $layout->set_homogeneous(1 == 0);
- addLabelledEntry("_Datum: ", "date", $layout, 0);
- addLabelledEntry("_Uhrzeit: ", "time", $layout, 1);
- addLabelledEntry("_Kennzeichen: ", "kennzeichen", $layout, 2);
- addLabelledEntry("_Hersteller: ", "hersteller", $layout, 3);
- addLabelledEntry("_Farbe: ", "farbe", $layout, 4);
- my $label = Gtk2::Label->new_with_mnemonic("_Preset: ");
- $label->set_alignment(1, 0.5);
- $label->set_width_chars(15);
- $layout->attach($label, 0, 3, 5, 6, 'shrink', 'shrink', 1, 1);
- my $textview = Gtk2::TextView->new();
- $textview->set_accepts_tab(FALSE);
- $textview->set_cursor_visible(TRUE);
- $textview->set_wrap_mode("word");
- my $combobox = Gtk2::ComboBox->new_text();
- foreach my $key (sort {$a cmp $b} keys %presets) {
- $combobox->append_text($key);
- }
- $combobox->signal_connect('changed' => sub {
- my $entry = $combobox->get_active_text();
- foreach my $key (keys %{$presets{$entry}}) {
- $state{$key} = $presets{$entry}->{$key};
- $state{"${key}Entry"}->set_text($presets{$entry}->{$key}) if (exists $state{"${key}Entry"});
- }
- $textview->get_buffer->set_text(eval($template));
- });
- $layout->attach($combobox, 3, 6, 5, 6, 'fill', 'shrink', 1, 1);
- #addLabelledEntry("_Straße: ", "strasse", $layout, 6);
- #addLabelledEntry("_Hausnummer: ", "hausnummer", $layout, 7);
- #$textview->set_mnemonic("t");
- my $scrolledWindow = Gtk2::ScrolledWindow->new();
- $scrolledWindow->add_with_viewport($textview);
- $layout->attach($scrolledWindow, 0, 6, 8, 9, 'fill', ['expand', 'fill'], 3, 3);
- my $mapsButton = Gtk2::Button->new_with_mnemonic('_Maps öffnen');
- $mapsButton->signal_connect('clicked' => sub { openMapsLocation(); });
- $layout->attach($mapsButton, 0, 2, 9, 11, 'fill', 'shrink', 3, 1);
- my $resizeButton = Gtk2::Button->new_with_mnemonic('_Bild _kleiner');
- $resizeButton->signal_connect('clicked' => sub {});
- $layout->attach($resizeButton, 2, 4, 9, 11, 'fill', 'shrink', 1, 1);
- my $composeButton = Gtk2::Button->new_with_mnemonic('_E-Mail ...');
- $composeButton->signal_connect('clicked' => sub { composeEMail(); });
- $layout->attach($composeButton, 4, 6, 9, 11, 'fill', 'shrink', 1, 1);
- # add our image to the window
- #my $pixbuf = Gtk2::Gdk::Pixbuf->new_from_file_at_size($state{file}, 600, 800);
- #my $image = Gtk2::Image->new_from_pixbuf($pixbuf);
- my $image = Gtk2::ImageView->new();
- my $pixbuf = Gtk2::Gdk::Pixbuf->new_from_file($state{file});
- $image->set_pixbuf($pixbuf);
- $layout->attach(Gtk2::ImageView::ScrollWin->new($image), 6, 7, 0, 10, ['expand', 'fill'], ['expand', 'fill'], 0, 0);
- my $imgProps = Gtk2::Label->new(
- $state{file} .
- ": " .
- $pixbuf->get_width() .
- "x" .
- $pixbuf->get_height() .
- ", " .
- humanReadableFilesize($state{file})
- );
- $layout->attach($imgProps, 6,7, 10, 11, 'fill', 'shrink', 1, 1);
- $window->add($layout);
- $window->set_default_size(800, 600);
- $window->show_all();
- $window->signal_connect(delete_event => sub { Gtk2->main_quit; TRUE });
- Gtk2->main();
- sub addLabelledEntry {
- my ($labelText, $stateField, $layout, $row) = @_;
- my $label = Gtk2::Label->new_with_mnemonic($labelText);
- $label->set_alignment(1, 0.5);
- # $label->set_single_line_mode();
- $label->set_width_chars(length($labelText)+3);
- my $entry = Gtk2::Entry->new();
- $entry->set_text($state{$stateField} or "");
- $entry->signal_connect(changed => sub { $state{$stateField} = $entry->get_text(); });
- $state{"${stateField}Entry"} = $entry;
- $label->set_width_chars(15);
- $label->set_mnemonic_widget($entry);
- $layout->attach($label, 0, 3, $row, $row + 1, 'shrink', 'shrink', 1, 1);
- $layout->attach($entry, 3, 6, $row, $row + 1, 'shrink', 'shrink', 1, 1);
- }
- # get the date and the time of the image
- # this could come from the image's EXIF data
- # or just from the filename itself (as in this implementation)
- sub getDateTime {
- my $file = $state{file};
- if ($file =~ m/IMG_(\d\d\d\d)(\d\d)(\d\d)_(\d\d)(\d\d)\d\d.*\.jpg$/) {
- return ("$3. $monthNames[$2] $1", "$4:$5");
- } else {
- die "cannot parse filename $file";
- }
- }
- sub getPlateNumber {
- my $file = $state{file};
- my $pnumberjson = `alpr -j -c eu -n 1 $file`;
- my $resultall = decode_json($pnumberjson);
- my $result = $resultall->{"results"};
- if (scalar @{$result} == 1) {
- my $plate = $result->[0]->{"candidates"}->[0]->{"plate"};
- if ($plate =~ m/^(\w[A-Z]*)(\d\d*)$/) {
- my $origin = substr $1, 0, 2;
- my $rest = substr $1, 2;
- $plate = "$origin-$rest-$2";
- }
- return $plate;
- }
- return "";
- }
- sub humanReadableFilesize {
- my $file = $_[0];
- my $size = -s $file;
- return sprintf("%.2fMB", $size / 1048576) if ($size > 1048576);
- return sprintf("%.2fkB", $size / 1024) if ($size > 1024);
- return $size . "B";
- }
- sub compressImage {
- }
- # use a script that I found which wraps exittool for us
- sub openMapsLocation {
- my $mapsURL = `$FindBin::Bin/exif2map.pl -f $state{file}`;
- chomp $mapsURL; chomp $mapsURL;
- print STDERR "opening --$mapsURL--";
- `firefox $mapsURL`;
- }
- sub composeEMail {
- my %args;
- # your own mail-account if you have multiple in Thunderbird
- $args{preselectid} = "id2";
- # address to send e-mail to
- $args{to} = "bussgeldstelle\@eza.hamburg.de";
- # attach the file
- $args{attachment} = $state{file};
- $args{subject} = "Anzeige wegen Falschparkens des Kfz $state{kennzeichen} am $state{date}";
- $args{body} = $textview->get_buffer->get_property('text');
- my $command;
- my ($key, $val);
- while (($key, $val) = each %args) {
- $command .= "$key='$val',";
- }
- print $command;
- print "\n\n";
- # see http://kb.mozillazine.org/Command_line_arguments_-_Thunderbird for details
- `thunderbird -compose \"$command\"`;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement