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.