Instead of enqueueing pixels, you enqueue an offset, and a length of 32 (and the thread will also need the width of the image).
With that data, each thread is able to calculate itself its tasked pixels.
Thus, if I have offset=0 the formula give calculates
(x=0,y=0) to (x=8,y=0).
If I have offset=32 the formula give calculates
(x=8,y=0) to (x=16,y=0).
Those are 8 pixels of 4 bytes each (RGBA).
you can avoid that thread-save problem with imagemagick.
You read an image and $blob=$original->ImageToBlob(); then manipulate all pixels in the blob, and BlobToImage() back.
See this imagemagick post.
And also this Permonk post: Re: reading in raw data into perl's ImageMagick
At least these primitives are ok with threads? (although not your eyes, you see I used seizure inducing red and green lines... sorry for that)
#! perl
use warnings;
use strict;
use threads;
use Image::Magick;
my $image = Image::Magick->new(
size => "600x600",
);
$image->Read("xc:white");
for my $i (200..400){
async{
my $color = $i % 2 ? '#f00' : '#0f0';
$image->Draw(
primitive => 'line',
points => "$i,100 $i,500",
stroke => $color,
);
}->join;
}
$image->Set(magick=>'gif');
my $blob = $image->ImageToBlob();
open(FH,"> $0.gif")or die "$!\n";
print FH $blob;
close FH;
perldoc threads
-
Are you posting in the right place? Check out Where do I post X? to know for sure.
-
Posts may use any of the Perl Monks Approved HTML tags. Currently these include the following:
<code> <a> <b> <big>
<blockquote> <br /> <dd>
<dl> <dt> <em> <font>
<h1> <h2> <h3> <h4>
<h5> <h6> <hr /> <i>
<li> <nbsp> <ol> <p>
<small> <strike> <strong>
<sub> <sup> <table>
<td> <th> <tr> <tt>
<u> <ul>
-
Snippets of code should be wrapped in
<code> tags not
<pre> tags. In fact, <pre>
tags should generally be avoided. If they must
be used, extreme care should be
taken to ensure that their contents do not
have long lines (<70 chars), in order to prevent
horizontal scrolling (and possible janitor
intervention).
-
Want more info? How to link
or How to display code and escape characters
are good places to start.