O'Reilly logo

Mastering Perl/Tk by Nancy Walsh, Stephen Lidie

Stay ahead with the world's most comprehensive technology and business learning platform.

With Safari, you learn the way you learn best. Get unlimited access to videos, live online training, learning paths, books, tutorials, and more.

Start Free Trial

No credit card required

The Photo Image Type

Like Bitmap and Pixmap image types, a Photo supports -data and -file options. Unlike those simpler images, Photos additionally support several image formats and manipulation methods. The Photo constructor attempts to auto-detect the format of an image, but failing that, we can state it explicitly. The -format option is a case-insensitive string that can be one of "bmp", "ppm", or "gif" (or "png", "jpeg", or "tiff", if you have those image extensions installed).

All current Photo image formats are binary data, so to incorporate them into our Perl/Tk code we need to encode the data into printable characters. All Photo image formats that support the -data option require that the data be Base64 MIME encoded. Given a filename, encode_photo_data does just that and returns the resulting string:

sub encode_photo_data {
    
    my($file) = @_;

    use MIME::Base64;
    my ($bin, $data, $stat);

    open PHOTO, $file or die "Cannot open $file: $!";
    while ( $stat = sysread PHOTO, $bin, 57 * 17 ) {
        $data .= encode_base64($bin);
    }
    close PHOTO or die $!;
    die "sysread error: $!" unless defined $stat;

    $data;

} # end encode_photo_data

The Photo data method can do the encoding for us as well. All we need to do is specify the format:

my $encoded_data = $photo->data(-format => 'png');

In either case, you can print the encoded results to a file and insert the data directly into your Perl/Tk program.

Unfortunately, the Photo format handlers are not created equally where -data is concerned. Currently ...

With Safari, you learn the way you learn best. Get unlimited access to videos, live online training, learning paths, books, interactive tutorials, and more.

Start Free Trial

No credit card required