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 ...

Get Mastering Perl/Tk now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.