zieglers has asked for the wisdom of the Perl Monks concerning the following question:

I have raw images that are in 1 byte/pixel format and I have a scale factor in a Perl variable say $sf. What is the best way read the image, multiply each pixel value by this scale factor, and write the file? I have read some on PDL but not sure if this is the best approach. I write Perl maybe once/year so forgive me if I have overlooked the obvious. Thank you.

Replies are listed 'Best First'.
Re: Image processing
by Corion (Patriarch) on Nov 19, 2009 at 20:41 UTC

    I'd look at the color transformation methods available in Imager, as documented in Imager::Transformations. Most likely, something like the following should work:

    $new = $img->convert(matrix=>[ [ $sf ] ])

    ... assuming you have a grayscale image and I interpret the transformation matrix correctly.

Re: Image processing
by etj (Priest) on May 29, 2022 at 22:46 UTC
    use PDL; use PDL::IO::Pic; $img = rpic 'filename.png'; $img *= $scale_factor; $img->wpic('filename2.png');
    Hopefully fairly self-explanatory. That's literally all you need to do. See PDL::IO::Pic for more on image read/writing, and PDL::QuickStart for more on PDL use.
Re: Image processing
by zentara (Cardinal) on Nov 20, 2009 at 13:27 UTC
    ...almost all image toolkits have advanced scale functions.... the best is the gimp...as it will give you the all the various options available in a scale.... but the perl automation to it, Perl-Gimp can be hard to get right..... ImageMagick functions ( see PerlMagick for all the options).....to be honest the ImageMagick maillist might be a good place to ask..... thay may have a 1 liner shell script

    ....if you really need to do it manually, it sounds like you want to read your file in 8 bits at at time, multiply it, then write it out to a separate file....sysread would be easy ... pack and unpack would be good too.... but a but more complex

    #!/usr/bin/perl use warnings; use strict; my $file = shift || $0; my $len = 8; open FILE, $file or die "$!"; # write to your scaled file instead of stdout while (sysread FILE, my $data, $len){ # multiply your data here syswrite STDOUT, $data };

    I'm not really a human, but I play one on earth.
    Old Perl Programmer Haiku