#!/usr/bin/perl use 5.014; my ($file, $size) = @ARGV; my @info = eval { require Image::ExifTool; my $exif = Image::ExifTool->new->ImageInfo($file); return ( " $exif->{MIMEType}", $exif->{ImageSize} ? " $exif->{ImageSize} ($exif->{Megapixels}MP)" : (), join(' ', '', $exif->{YCbCrSubSampling} // (), $exif->{Interlace} // (), $exif->{Compression} // $exif->{FileType}, $exif->{SVGVersion} // $exif->{PDFVersion} // (), ), $exif->{ColorType} ? " $exif->{BitDepth}bpp $exif->{ColorType}" : (), sprintf(' exif x%d', scalar %{$exif}), $exif->{Thumb} ? " thumb $exif->{ThumbnailLength}B" : (), (map " @ $_", $exif->{DateCreated} // $exif->{CircaDateCreated} // $exif->{ModifyDate} // $exif->{ZipModifyDate} // (), ), $exif->{GPSPosition} ? " $exif->{GPSPosition}" =~ s/ deg/./gr : $exif->{Location} ? " $exif->{Location}" : (), $exif->{GPSAltitude} ? " $exif->{GPSAltitude}" : (), (map " hw $_", join(' ', $exif->{Make} // (), $exif->{Model} // (), $exif->{FOV} ? "(FOV $exif->{FOV})" : (), ) || ()), (map " sw $_", $exif->{Software} // $exif->{Application} // ()), (map " > $_", $exif->{'Description-nl'} // ()), $exif->{Warning} ? " ! $exif->{Warning}" : (), ); } or warn $@; eval { require Digest::MD5; open my $bin, '<', $file; binmode $bin; my $md5 = Digest::MD5->new->addfile($bin); push @info, ' # '.$md5->b64digest; } or warn $@; open my $pgm, '-|', convert => ( -compress => 'none', '+distort' => SRT => '0,0 1,.56 0', -thumbnail => $size || '66x23', $file => 'pgm:-' ) or die $!; <$pgm> eq "P2\n" or do { say for @info; exit 1; }; <$pgm>; <$pgm>; # ignore depth, dimensions my @ch = split //, " .:coO@"; while (<$pgm>) { print $ch[ $_ * @ch >> 8 ] for /\d+/g; print $info[$. - 4], $/; }