Compare commits
2 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| fa5d3ee9cb | |||
|
|
4a92702082 |
1
.gitignore
vendored
1
.gitignore
vendored
@@ -2,3 +2,4 @@
|
|||||||
links/*
|
links/*
|
||||||
pics/*
|
pics/*
|
||||||
slike/*
|
slike/*
|
||||||
|
linki/*
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ use File::Find::Wanted;
|
|||||||
use File::Basename;
|
use File::Basename;
|
||||||
use File::Spec;
|
use File::Spec;
|
||||||
use File::Spec::Functions;
|
use File::Spec::Functions;
|
||||||
use Image::EXIF;
|
use Image::Size;
|
||||||
use Data::Dumper::Simple;
|
use Data::Dumper::Simple;
|
||||||
use Math::Round;
|
use Math::Round;
|
||||||
|
|
||||||
@@ -59,64 +59,42 @@ if (! @list) {
|
|||||||
exit 0
|
exit 0
|
||||||
}
|
}
|
||||||
|
|
||||||
# extract the EXIF data from the files and build a hash from all that stuff
|
# Go through all the image files and build the hash that holds all the
|
||||||
|
# information about them.
|
||||||
my $count = 0; # how many files?
|
my $count = 0; # how many files?
|
||||||
my $errors = 0; # how many errors?
|
my $errors = 0; # how many errors?
|
||||||
my $ars = {}; # a hashref that holds all the encountered aspect rations and their number of occurence
|
my $ars = {}; # a hashref that holds all the encountered aspect rations and their number of occurence
|
||||||
my $files = {}; # a hashref that holds all the files, their exif data, and their calculcated aspect ratio
|
my $files = {}; # a hashref that holds all the files, their exif data, and their calculcated aspect ratio
|
||||||
foreach my $f (@list) {
|
foreach my $f (@list) {
|
||||||
$count++;
|
$count++;
|
||||||
msg "Gathering info for image in file: '$f'\n";
|
msg "Gathering sizes for image in file: '$f'\n";
|
||||||
my $e = Image::EXIF->new($f);
|
(my $x, my $y) = imgsize($f);
|
||||||
my $exif = $e->get_image_info();
|
|
||||||
|
# calculate aspect ratio
|
||||||
my ($x, $y, $error_flag);
|
|
||||||
# Check for the existence of x
|
|
||||||
if (!defined $exif->{"Image Width"}) {
|
|
||||||
msg "Could not find attribute 'Image Width' for image '$f'.\n";
|
|
||||||
$error_flag = 1;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
$x = $exif->{"Image Width"};
|
|
||||||
}
|
|
||||||
|
|
||||||
# Check for the existence of y
|
|
||||||
if (!defined $exif->{"Image Height"}) {
|
|
||||||
msg "Could not find attribute 'Image Height' for image '$f'.\n";
|
|
||||||
$error_flag = 1;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
$y = $exif->{"Image Height"};
|
|
||||||
}
|
|
||||||
|
|
||||||
# Calculate aspect ratio and append it into the hash
|
|
||||||
my $ar;
|
my $ar;
|
||||||
if ($error_flag) {
|
if ($x and $y) {
|
||||||
msg "Unable to calculate aspect ratio for image '$f'.\n";
|
$ar = nearest(0.1, ($x > $y) ? $x / $y : $y / $x);
|
||||||
$ar = "unknown";
|
$ars->{$ar}++;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
$ar = nearest(0.01, ($x > $y) ? $x / $y : $y / $x) unless $error_flag;
|
$errors++;
|
||||||
}
|
}
|
||||||
$ars->{$ar}++;
|
|
||||||
|
# append the stuff to hash
|
||||||
|
$files->{$f}->{x} = $x;
|
||||||
|
$files->{$f}->{y} = $y;
|
||||||
$files->{$f}->{ar} = $ar;
|
$files->{$f}->{ar} = $ar;
|
||||||
|
|
||||||
# Append the exif data into hash
|
|
||||||
$files->{$f}->{exif} = $exif;
|
|
||||||
|
|
||||||
# bump the number of errors
|
|
||||||
$errors++ if $error_flag;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
# Dump the EXIF data of all images
|
# Dump the hash data if we are in debug mode.
|
||||||
if ($conf->{debug}) {
|
if ($conf->{debug}) {
|
||||||
msg_debug "All images and their EXIF data:\n";
|
msg_debug "All images and their data:\n";
|
||||||
print Dumper $files;
|
print Dumper $files;
|
||||||
msg_debug "\n";
|
msg_debug "\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
# Dump some statistics
|
# Dump some statistics.
|
||||||
msg "Total images found: $count. Images with invalid EXIF data: $errors\n";
|
msg "Number of images found: $count. Number of images with errors: $errors.\n";
|
||||||
msg "Aspect ratio information for all images (aspect ratio => number of occurences):\n";
|
msg "Aspect ratio information for all images (aspect ratio => number of occurences):\n";
|
||||||
print Dumper $ars;
|
print Dumper $ars;
|
||||||
|
|
||||||
@@ -135,8 +113,8 @@ msg "Symlinking source files into destination directories.\n";
|
|||||||
foreach my $f (keys %$files) {
|
foreach my $f (keys %$files) {
|
||||||
next unless exists $files->{$f}->{ar};
|
next unless exists $files->{$f}->{ar};
|
||||||
|
|
||||||
# Construct the symlink path. TODO: use something smarter than just string
|
# Construct the path of the symlink. This is quite tricky to get right.
|
||||||
# concatenation.
|
# TODO: use something smarter than just string concatenation.
|
||||||
msg_debug "\$f='$f' ";
|
msg_debug "\$f='$f' ";
|
||||||
my $ar = $files->{$f}->{ar}; msg_debug "\$ar='$ar' ";
|
my $ar = $files->{$f}->{ar}; msg_debug "\$ar='$ar' ";
|
||||||
my $symlink_dir = $conf->{dst_dir} . "/" . $ar; msg_debug "\$symlink_dir='$symlink_dir' ";
|
my $symlink_dir = $conf->{dst_dir} . "/" . $ar; msg_debug "\$symlink_dir='$symlink_dir' ";
|
||||||
@@ -144,10 +122,11 @@ foreach my $f (keys %$files) {
|
|||||||
my $symlink_dst = File::Spec->abs2rel(
|
my $symlink_dst = File::Spec->abs2rel(
|
||||||
File::Spec->rel2abs($f),
|
File::Spec->rel2abs($f),
|
||||||
File::Spec->rel2abs($symlink_dir)
|
File::Spec->rel2abs($symlink_dir)
|
||||||
); msg_debug "\$symlink_dst='$symlink_dst' ";
|
);
|
||||||
|
msg_debug "\$symlink_dst='$symlink_dst' ";
|
||||||
msg_debug "\n";
|
msg_debug "\n";
|
||||||
|
|
||||||
# symlink
|
# Create the symlink.
|
||||||
msg_debug "symlink($symlink_dst, $symlink);\n";
|
msg_debug "symlink($symlink_dst, $symlink);\n";
|
||||||
symlink($symlink_dst, $symlink);
|
symlink($symlink_dst, $symlink);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user