MCE::Map constructs the MCE object internally. Well, here is the same thing using MCE.
#!/usr/bin/env perl
# https://www.perlmonks.org/?node_id=11104804
# Animated Heatmap
# v1. https://www.perlmonks.org/index.pl?node_id=11104262
# v2. https://www.perlmonks.org/index.pl?node_id=11104285
# v3. This; feel free to hack it up and post your version!
use strict;
use warnings;
use Imager;
use Imager::Filter::Flines;
use Imager::Heatmap;
use MCE;
# Configuration
my $size = { x => 600, y => 60 };
my $japh = 'Just another Perl hacker';
my $filename = 'heatmap_anon_bliako.gif';
# Figure out font
my $fontface
= $^O eq 'MSWin' ? 'Arial'
: $^O eq 'darwin' ? '/System/Library/Fonts/Keyboard.ttf'
: '/usr/share/fonts/open-sans/OpenSans-Semibold.ttf';
my $font = $^O eq 'MSWin'
? Imager::Font->new(
face => $fontface,
size => $size->{x}/12,
aa => 1)
: Imager::Font->new(
file => $fontface,
size => $size->{x}/12,
aa => 1);
STDOUT->autoflush(1);
print "Generating GIF frame ";
# Create the image
my $text = Imager->new(xsize=>$size->{x}, ysize=>$size->{y});
# Generate the text
$text->box(color => Imager::Color->new(255, 255, 255), filled => 1);
$text->string(
font => $font,
text => $japh,
color => Imager::Color->new('#000000'),
x => 1, y => ($size->{x}/12)-1,
);
my @insert = ();
# Scan image of text for heatmap data
for my $x (0..$size->{x}-1) {
for my $y (0..$size->{y}-1) {
my $pix = ($text->getpixel(x=>$x, y=>$y, type=>'8bit')->rgba())[0]
+;
push @insert, [ $x, $y, $pix ]
}
}
# Generate, draw and filter the heatmap
my @data;
MCE->new(
max_workers => 10,
input_data => [ 1 .. 10 ],
chunk_size => 1,
init_relay => '',
gather => sub {
my ($chunk_id) = @_;
$data[ $chunk_id - 1 ] = $_[1];
},
user_func => sub {
my $x = $_;
my $hmap = Imager::Heatmap->new(
xsize => $size->{x},
ysize => $size->{y},
xsigma => $x,
ysigma => $x,
);
$hmap->insert_datas(@insert);
$hmap = $hmap->draw;
$hmap->filter(type => 'flines');
my $data;
$hmap->write(data => \$data, type => 'png');
# calling relay so orderly print output
MCE::relay {
print "$x ";
MCE->gather(MCE->chunk_id, $data);
};
}
)->run;
print "done!\n";
# Write animated gif
Imager->write_multi({
file => $filename,
transp => 'none',
gif_loop => 0,
}, map { Imager->read_multi(data => \$_) } @data);
# Isn't perl wonderful?
print "Saved $filename\n";
Regards, Mario