in reply to Fast way to compare two picture-files

Sounds like you want to compare the files and not the pictures?

sub comp { my ($qfn1, $qfn2) = @_; open(my $fh1, '<:raw:stdio', $qfn1) or die("Unable to open file \"$qfn1\": $!\n"); open(my $fh2, '<:raw:stdio', $qfn2) or die("Unable to open file \"$qfn2\": $!\n"); my $size1 = -f $fh1 && -s _; my $size2 = -f $fh2 && -s _; return 0 if $size1 && $size2 && $size1 != $size2; local $/ = \(16*1024); for (;;) { my $blk1 = <$fh1>; my $blk2 = <$fh2>; return 0 if defined($blk1) xor defined($blk2); return 1 if !defined($blk1); return 0 if if $blk1 ne $blk2; } }

Taking the a digest (such as MD5) of the file which speed things up if you need to compare a file against multiple other files.

Update: Added size check up front.

Replies are listed 'Best First'.
Re^2: Fast way to compare two picture-files
by fullermd (Vicar) on Dec 29, 2008 at 07:39 UTC
    Why write it manually? Someone else already did it.
    use File::Compare; compare("foo.jpg", "bar.jpg");
Re^2: Fast way to compare two picture-files
by talexb (Chancellor) on Dec 29, 2008 at 09:06 UTC

    Depending on what the OP is asking for, checking the first 16K of the file won't provide the correct answer if a) the OP is trying to determine are the images the same (rather than just are the files identical) and b) the files are in different formats (say, JPG and BMP) but are actually the same image.

    Update Oops -- ikegami is quite right, the loop checks the entire file, not just the first 16K.

    Alex / talexb / Toronto

    "Groklaw is the open-source mentality applied to legal research" ~ Linus Torvalds

      The code checks the entire file (not just the first 16K). "for (;;)" can be read as "for ever". And the post already says the code compares files not images.