++ed by:

10 PAUSE users

Randy J Ray


Image::Size - read the dimensions of an image in several popular formats


    use Image::Size;
    # Get the size of globe.gif
    ($globe_x, $globe_y) = imgsize("globe.gif");
    # Assume X=60 and Y=40 for remaining examples

    use Image::Size 'html_imgsize';
    # Get the size as 'width="X" height="Y"' for HTML generation
    $size = html_imgsize("globe.gif");
    # $size == 'width="60" height="40"'

    use Image::Size 'attr_imgsize';
    # Get the size as a list passable to routines in CGI.pm
    @attrs = attr_imgsize("globe.gif");
    # @attrs == ('-width', 60, '-height', 40)

    use Image::Size;
    # Get the size of an in-memory buffer
    ($buf_x, $buf_y) = imgsize($buf);


The Image::Size library is based upon the wwwis script written by Alex Knowles (alex@ed.ac.uk), a tool to examine HTML and add 'width' and 'height' parameters to image tags. The sizes are cached internally based on file name, so multiple calls on the same file name (such as images used in bulleted lists, for example) do not result in repeated computations.

Image::Size provides three interfaces for possible import:


Returns a three-item list of the X and Y dimensions (width and height, in that order) and image type of stream. Errors are noted by undefined (undef) values for the first two elements, and an error string in the third. The third element can be (and usually is) ignored, but is useful when sizing data whose type is unknown.


Returns the width and height (X and Y) of stream pre-formatted as a single string 'width="X" height="Y"' suitable for addition into generated HTML IMG tags. If the underlying call to imgsize fails, undef is returned. The format returned should be dually suited to both HTML and XHTML.


Returns the width and height of stream as part of a 4-element list useful for routines that use hash tables for the manipulation of named parameters, such as the Tk or CGI libraries. A typical return value looks like ("-width", X, "-height", Y). If the underlying call to imgsize fails, undef is returned.

By default, only imgsize() is imported. Any one or combination of the three may be imported, or all three may be with the tag :all.

Input Types

The sort of data passed as stream can be one of three forms:


If an ordinary scalar (string) is passed, it is assumed to be a file name (either absolute or relative to the current working directory of the process) and is searched for and opened (if found) as the source of data. Possible error messages (see DIAGNOSTICS below) may include file-access problems.

scalar reference

If the passed-in stream is a scalar reference, it is interpreted as pointing to an in-memory buffer containing the image data.

        # Assume that &read_data gets data somewhere (WWW, etc.)
        $img = &read_data;
        ($x, $y, $id) = imgsize(\$img);
        # $x and $y are dimensions, $id is the type of the image
Open file handle

The third option is to pass in an open filehandle (such as an object of the IO::File class, for example) that has already been associated with the target image file. The file pointer will necessarily move, but will be restored to its original position before subroutine end.

        # $fh was passed in, is IO::File reference:
        ($x, $y, $id) = imgsize($fh);
        # Same as calling with filename, but more abstract.

Recognizd Formats

Image::Size understands and sizes data in the following formats:

  • GIF

  • JPG

  • XBM

  • XPM

  • PPM family (PPM/PGM/PBM)

  • PNG

  • TIF

  • BMP

When using the imgsize interface, there is a third, unused value returned if the programmer wishes to save and examine it. This value is the three- letter identity of the data type. This is useful when operating on open file handles or in-memory data, where the type is as unknown as the size. The two support routines ignore this third return value, so those wishing to use it must use the base imgsize routine.


The base routine, imgsize, returns undef as the first value in its list when an error has occured. The third element contains a descriptive error message.

The other two routines simply return undef in the case of error.


The attr_imgsize interface is also well-suited to use with the Tk extension:

    $image = $widget->Photo(-file => $img_path, attr_imgsize($img_path));

Since the Tk::Image classes use dashed option names as CGI does, no further translation is needed.

This package is also well-suited for use within an Apache web server context. File sizes are cached upon read (with a check against the modified time of the file, in case of changes), a useful feature for a mod_perl environment in which a child process endures beyond the lifetime of a single request. Other aspects of the mod_perl environment cooperate nicely with this module, such as the ability to use a sub-request to fetch the full pathname for a file within the server space. This complements the HTML generation capabilities of the CGI module, in which CGI::img wants a URL but attr_imgsize needs a file path:

    # Assume $Q is an object of class CGI, $r is an Apache request object.
    # $imgpath is a URL for something like "/img/redball.gif".
    $r->print($Q->img({ -src => $imgpath,
                        attr_imgsize($r->lookup_uri($imgpath)->filename) }));

The advantage here, besides not having to hard-code the server document root, is that Apache passes the sub-request through the usual request lifecycle, including any stages that would re-write the URL or otherwise modify it.


Caching of size data can only be done on inputs that are file names. Open file handles and scalar references cannot be reliably transformed into a unique key for the table of cache data. Buffers could be cached using the MD5 module, and perhaps in the future I will make that an option. I do not, however, wish to lengthen the dependancy list by another item at this time.


http://www.tardis.ed.ac.uk/~ark/wwwis/ for a description of wwwis and how to obtain it.


Perl module interface by Randy J. Ray (rjray@tsoft.com), original image-sizing code by Alex Knowles (alex@ed.ac.uk) and Andrew Tong (werdna@ugcs.caltech.edu), used with their joint permission.

Some bug fixes submitted by Bernd Leibing (bernd.leibing@rz.uni-ulm.de). PPM/PGM/PBM sizing code contributed by Carsten Dominik (dominik@strw.LeidenUniv.nl). Tom Metro (tmetro@vl.com) re-wrote the JPG and PNG code, and also provided a PNG image for the test suite. Dan Klein (dvk@lonewolf.com) contributed a re-write of the GIF code. Cloyce Spradling (cloyce@headgear.org) contributed TIFF sizing code and test images. Aldo Calpini (a.calpini@romagiubileo.it) suggested support of BMP images (which I really should have already thought of :-) and provided code to work with. A patch to allow html_imgsize to produce valid output for XHTML, as well as some documentation fixes was provided by Charles Levert (charles@comm.polymtl.ca).