I'd rather not mess with saving to a file at all.In the abscense of a full working code snippet, here is an example that should show you the tricks needed, especially Image::Magick's BlobtoImage() and ImagetoBlob() methods. IM calls the scalar output of images blobs, and with base64encoding you can put them directly into Tk Photo objects, with no intermediate disk file. This example finds .jpgs in the current directory and resizes them upon a window resize, with an optional charcoal effect.
In your code, after the screenshot, load the binary screenshot $screen to a IM object with -data ( as you show) , work on it's effects, then redisplay it using a base64encoded ImagetoBlob(). Also notice the <visibility> binding, which you may or may not need.
UPDATE: see second response below, I don't believe IM can Read( -data), ie. a binary screenshot in a scalar. You need BlobtoImage, to load it.
#!/usr/bin/perl -w
use strict;
use Tk;
use Tk::JPEG;
use Image::Magick;
use MIME::Base64;
my $val = 0;
my $im = Image::Magick->new; # a single object for thumbnails
my $c;
my $dir = ".";
my @fl = <*.jpg>;
print "@fl\n";
my $main = new MainWindow;
$main->Label( -text => "Resize Window to see resizing and charcoal eff
+efct",
)->pack();
my $photo_obj = $main->Photo(-file => '' );
my $display = $main->Label(-width => 200,
-height => 200,
-image => $photo_obj,
)->pack(-fill=>'both', -expand=>1);
&loadpic( $fl[0] );
my $frame = $main->Frame()->pack();
my $nxt = $frame->Button(-text => "Next",
-command => \&nextp)->pack(-side=>'left');
$frame->Button(-text => 'exit',
-command => sub{destroy $main}
)->pack(-side=> 'left');
$frame->Checkbutton(
-onvalue => 1,
-offvalue => 0,
-text => 'Charcoal',
-variable => \$val)->pack(-side=> 'left');
#$main->bind("<Visibility>", sub { $nxt->invoke });
$main->bind("<Visibility>", \&nextp);
MainLoop;
sub loadpic {
my $filename = shift;
$photo_obj->blank; #clear out old jpg
my ($h,$w) = ($display->height, $display->width);
#
# how to scale the pic?
# Create new size version
$im->Read($filename);
$im->Scale( geometry => $w.'x'.$h );
if($val){ $im->Charcoal('0x1') }
#Tk needs base64 encoded image files
my $data = encode_base64( $im->ImageToBlob() );
undef @$im; # blank $im object
$photo_obj->put($data);
$display->configure(-image => $photo_obj);
}
sub nextp {
push (@fl,shift(@fl)); #circular list
my $f = $fl[0];
loadpic("$dir/$f");
}
|