use strict;
use warnings;
my %Image = (); keys %Image = 4096 * 128;
my $rdamt = 4096 * 6;
my $buffer;
# my $file = '249465.pprgb-srgb.absv.4000.cs.jpg'; # Original File downloaded
my $file = '249465.pprgb-srgb.absv.4000.cs.jpg2'; # New File multiple copies
my $compraw = -s $file; my $pixels = int ( $compraw / 6 );
open ( my $in, "<", "./$file") or die "$!\n";
while( 1 )
{
my $size = sysread( $in, $buffer, $rdamt ); # No buffering
if ( $size == 0 ) { last; }
while( $buffer )
{ if ( length( $buffer ) < 6 ) { last; } # Throw away odd number of pixels
my $key = substr( $buffer, 0, 6, '' );
$Image{$key}++;
}
}
close $in;
my $uniq = keys %Image;
my $factor = sprintf("%.2f", $uniq / $pixels );
print "Found $uniq colors in $pixels pixels $factor\%\n";
__END__
####
> time pyrperl uniqcolors.plx
Found 153601 colors in 153606 pixels 1.00% ( File size: 921,638 )
real 0m0.098s
user 0m0.092s
sys 0m0.008s
####
> time pyrperl uniqcolors.plx
Found 460775 colors in 41473710 pixels 0.01% ( File size: 248,842,260 )
real 0m15.015s
user 0m14.937s
sys 0m0.080s