By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
459,366 Members | 1,364 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 459,366 IT Pros & Developers. It's quick & easy.

Image::Magick and Tk::Photo

P: n/a

I am trying to read in a bunch of images and manipulate them using
Image::Magick, then display them using Tk::Photo. I would like to do this
without creating a temp file for each image, since there can be quite a few
of them.

However, I can't make Tk::Photo understand the data returned by
Image::Magick's ImageToBlob() function. Here is the way I had hoped it would
work:

#!perl

use strict;
use warnings;

use Tk;
use Image::Magick;

my $image = Image::Magick->new();
$image->read('c:\Documents and Settings\ericm\My Documents\My
Pictures\earthris.gif');

# Do various Image::Magick manipulations here...
# ...

my $blob = $image->ImageToBlob();

# Set up Tk windows
my $main = MainWindow->new();
my $photo = $main->Photo('img', -format=>'GIF', -data=>$blob );
$main->Label('-image' => 'img', -height=>200, -width=>200)->pack;

MainLoop;

###################################

This code generates the error "couldn't recognize image data at
C:/Perl/site/lib/Tk/Image.pm line 21." in the call to $main->Photo.
If I create a temp file with $image->write() and read it in using the
$main->Photo(-file=>'...') syntax, it works fine.

Any suggestions?

Thanks in advance.

-Eric
Jul 19 '05 #1
Share this Question
Share on Google+
2 Replies


P: n/a

"Eric McDaniel" <er**@mcdanielhome.com> wrote in message
news:DS*********************@rwcrnsc51.ops.asp.att .net...

I am trying to read in a bunch of images and manipulate them using
Image::Magick, then display them using Tk::Photo. I would like to do this
without creating a temp file for each image, since there can be quite a few
of them.

However, I can't make Tk::Photo understand the data returned by
Image::Magick's ImageToBlob() function. Here is the way I had hoped it would
work:

#!perl

use strict;
use warnings;

use Tk;
use Image::Magick; #-------------------------#
use Mime::Base64;
#-------------------------#

my $image = Image::Magick->new();
$image->read('c:\Documents and Settings\ericm\My Documents\My
Pictures\earthris.gif');

# Do various Image::Magick manipulations here...
# ...

my $blob = $image->ImageToBlob();
# Set up Tk windows
my $main = MainWindow->new();
my $photo = $main->Photo('img', -format=>'GIF', -data=>$blob );
#-------------------------#
my $photo = $main->Photo('img', -format=>'GIF', -data=>encode_base64($blob) );
#-------------------------#
####################### $main->Label('-image' => 'img', -height=>200, -width=>200)->pack;

MainLoop;

###################################

This code generates the error "couldn't recognize image data at
C:/Perl/site/lib/Tk/Image.pm line 21." in the call to $main->Photo.
If I create a temp file with $image->write() and read it in using the
$main->Photo(-file=>'...') syntax, it works fine.

Any suggestions?


You have to convert the data to base64 format for Tk to recognize it.

Jack
Jul 19 '05 #2

P: n/a

"Jack D." <go*********@hotmail.com> writes:
"Eric McDaniel" <er**@mcdanielhome.com> wrote:
I am trying to read in a bunch of images and manipulate them using
Image::Magick, then display them using Tk::Photo. I would like to do this
without creating a temp file for each image, since there can be quite a few
of them.

However, I can't make Tk::Photo understand the data returned by
Image::Magick's ImageToBlob() function.

use Mime::Base64; [...] my $photo = $main->Photo('img', -format=>'GIF', -data=>encode_base64($blob) ); [...] You have to convert the data to base64 format for Tk to recognize it.


Ah man, thanks much for the answer (not to mention the timely question
from Eric). I was just struggling with that issue myself. The
documentation for Tk::Photo leaves much to be desired.

Anyway, now I've got a "baby xv" script working, that re-scales large
images to fit the screen (something noticeably lacking in "ee" and
it's competitors in the free/open software world). It's a little
slow as written, but it least it works:

#!/usr/bin/perl -w
# tk_show_jpeg - do**@kzsu.stanford.edu
# Fri Sep 19 01:10:21 2003

# Simple image viewer, using Perl/Tk and ImageMagick
# This is a baby "xv": an image viewer that re-scales to fit the screen.

use strict;

use Tk;
use Tk::JPEG;
use Image::Magick;
use MIME::Base64;

my ($image_file, $mw, $screen_width, $screen_height);
my ($image_mag, $image_tk, $r, $blob);
my ($tempfile);
my ($img_height, $img_width, $new_height, $new_width, $geom);

$image_file = shift;

$mw = MainWindow->new;
$mw->title($image_file);

# Get screen dimensions
$screen_width = $mw ->screenwidth(); # 1024
$screen_height = $mw ->screenheight(); # 768
$screen_height -= 30; # allow slack for title bars, etc.

# Bind q key to quit
$mw->bind("<Key-q>", [sub{$mw->destroy}, Ev('K')]);

# Read in file into imagemagick

$image_mag = Image::Magick->new;
$r = $image_mag->Read("$image_file");
warn "$r" if "$r";

# Scale down $image_mag if necessary

($img_height, $img_width) = $image_mag->Get('height', 'width');

$new_height = $img_height; # "New" sizes default to the old
$new_width = $img_width;

if ($img_height > $screen_height) {
$new_height = $screen_height;
}
if ($img_width > $screen_width) {
$new_width = $screen_width;
}
$geom = $new_width . 'x' . $new_height;

$r = $image_mag->Scale(geometry=>$geom);
warn "$r" if "$r";

# Transfer image from ImageMagick to Perl/Tk

$blob = ( $image_mag->ImageToBlob(magick=>'jpg') )[0];
$image_tk = $mw->Photo('img', -format=>'jpeg', -data=>encode_base64($blob) );

# (I *gather* that that first argument 'img' is an "imageName"
# mentioned in some places in the docs, but not explained well.)

$mw->Label(-image => $image_tk)->pack(-side=>'left');
$mw->update;
MainLoop;
Jul 19 '05 #3

This discussion thread is closed

Replies have been disabled for this discussion.