9 my $file = shift or die;
11 open my $in_fh, '<', $file or die;
16 die unless $type eq 'SIMcache';
24 printf "Comment: %s\n", $1;
26 elsif (/^Dimensions=\[(\d+) x (\d+)\]$/)
28 printf "Original image dimensions: %d×%d\n", $1, $2;
32 printf "Date (used for pan-view): %s\n", $1;
34 elsif (/^Checksum=(.*)/)
36 printf "Checksum (never seen): %s\n", $1;
38 elsif (/^MD5sum=\[(.*)\]$/)
40 printf "MD5 sum: %s\n", $1;
42 elsif ($raw =~ /^SimilarityGrid\[(\d+) x (\d+)\]=(.*)$/s)
44 printf "Similarity image %d×%d\n", $1, $2;
45 if ($1 != 32 or $2 != 32)
47 print "Warning, similarity data are not size 32×32!\n";
50 my $simn = $1 * $2 * 3;
51 my ($width, $height) = ($1, $2);
54 $simdata = substr($simdata, 0, -1) if length($simdata) == $simn + 1; # In case all fits to one line
56 if (length($simdata) < $simn)
58 read $in_fh, $simdata, $simn - length($simdata), length($simdata) or die;
60 read $in_fh, $dummy, 1 or die;
63 printf "Warning, similarity data is not %d bytes", $simn unless length($simdata) == $simn;
65 if (length($simdata) == $simn)
67 my $gd = GD::Image->new($width, $height, 1);
69 for (my $x = 0; $x < $width; $x++)
71 for (my $y = 0; $y < $height; $y++)
73 my $colors = substr($simdata, ($x + $y * $width) * 3, 3);
74 my @rgb = unpack("CCC", $colors);
75 my $index = $gd->colorAllocate(@rgb);
76 $gd->setPixel($x, $y, $index);
78 } ## end for (my $x = 0; $x < $width; $...
81 open my $display_fh, '|-', qw(display -resize), sprintf("%dx%d", $width*10, $height*10), '-' or die;
83 print {$display_fh} $png;
85 } ## end if (length($simdata) == $simn)
86 } ## end elsif (/^SimilarityGrid\[(\d+)...
90 $field = $1 if /^(.*)=/;
92 printf "Unknown Field '$field'\n";
93 } ## end elsif (/^SimilarityGrid\[(\d+)...
94 } ## end while (<$in_fh>)