#!/usr/bin/perl -w # cmp_ppm.pl - Don Yang (uguu.org) # # Compare two PPM images, allowing each bytes to differ by at most 1 # to account for dithering. # # 01/02/12 use strict; die "$0 \n" unless $#ARGV == 1; # Load both files to memory my $file; open $file, "< $ARGV[0]" or die $!; my $input1 = join '', <$file>; close $file; open $file, "< $ARGV[1]" or die $!; my $input2 = join '', <$file>; close $file; # Compare headers $input1 =~ /^P6\n(\d+) (\d+)\n(\d+)\n/s or die "$ARGV[0]: bad header\n"; my ($width, $height, $range) = ($1, $2, $3); $input2 =~ /^P6\n(\d+) (\d+)\n(\d+)\n/s or die "$ARGV[1]: bad header\n"; my ($width2, $height2, $range2) = ($1, $2, $3); if( $width != $width2 || $height != $height2 || $range != $range2 ) { die "Headers mismatched\n"; } # Compare bytes if( length($input1) != length($input2) ) { die "File sizes mismatched: " . length($input1) . " vs. " . length($input2) . "\n"; } for(my $i = 0; $i < length($input1); $i++) { my $byte1 = ord(substr($input1, $i, 1)); my $byte2 = ord(substr($input2, $i, 1)); if( $byte1 != $byte2 && $byte1 != $byte2 + 1 && $byte2 != $byte1 + 1 ) { die (sprintf 'Bytes mismatched at offset 0x%x: %02x vs. %02x'."\n", $i, $byte1, $byte2); } }