in reply to Question: module to grab file information??

Depending on your task you (is it getting image size by chance?) you may find a module like Image::Size or Image::Info does the trick. If you want to see how its done here it is in Perl. Essentially just read the header and see what it matches, then unpack the size data.

#!/usr/bin/perl -w use strict; sub image_size { return unless $_[0]; my ($width, $height, $sig); if ( $_[0] =~ m/^GIF8..(....)/s ) { $sig = 'GIF'; ($width, $height) = unpack( "SS", $1 ); } elsif ( $_[0] =~ m/^^\xFF\xD8.{4}JFIF/s ) { $sig = 'JPEG'; ($height,$width) = unpack( "nn", $1 ) if $_[0] =~ /\xFF\xC0... +(....)/s; } elsif ( $_[0] =~ /^\x89PNG\x0d\x0a\x1a\x0a/ ) { $sig = 'PNG'; ($width, $height) = unpack( "NN", $1 ) if $_[0] =~ /IHDR(.{8}) +/s; } elsif ( $_[0] =~ /BM.{16}(.{8})/s ) { $sig = 'BMP'; ($width, $height) = unpack( "LL", $1); } return $width, $height, $sig; } for my $img ( qw( c:/sample.bmp c:/sample.jpg c:/sample.gif c:/sample. +png) ) { my $data = get_file($img); my @res = image_size($data); print "$img $res[2] width $res[0] height $res[1]\n"; } sub get_file { open my $fh $_[0] or die $!; binmode $fh; local $/; <$fh> } __END__ c:/sample.bmp BMP width 512 height 384 c:/sample.jpg JPEG width 100 height 149 c:/sample.gif GIF width 110 height 58 c:/sample.png PNG width 256 height 192

Replies are listed 'Best First'.
Re^2: Question: module to grab file information??
by lihao (Monk) on Apr 30, 2008 at 16:52 UTC

    Hi, tachyon-II:

    You are right, I have used GD::Image to grab size-infomation of about 99% image files. only those with type "PC bitmap data, Windows 3.x format" not available through GD::Image. but I can grab this missing information from running Linux 'file' command anyway. Just want to know if there is a Perl module which can handle this, instead of use code like below(untested):

    my $imginfo = qx[ file $myimg ]; my (width, height)= ($imginfo =~ m{(\d+) x (\d+) x \d+});

    thanks.

    lihao

      Does the code above not work? Is Image::Size not a module that does this?