in reply to Double the speed of Imager->setpixel
to generate an image involving about a million calls to Imager->setpixel
... almost certainly indicates a design flaw. Unless, of course, your pixels arrive at random unpredictable coordinates, to be scattered over a megapixel (or larger) canvas. Which I suspect they don't. (And even then it should be setscanline for each pixel with packed color as arg). Doco (emphasis mine):
The getscanline() and setscanline() methods can work with pixels packed into scalars. This is useful to remove the cost of creating color objects, but should only be used when performance is an issue
use strict; use warnings; use feature 'say'; use Time::HiRes 'time'; use Imager; sub get_RGB_triplet { map { int rand 256 } 0 .. 2 } { my $i = Imager-> new( xsize => 1000, ysize => 1000 ); my $t = time; for my $y ( 0 .. 999 ) { for my $x ( 0 .. 999 ) { my $c = Imager::Color-> new( get_RGB_triplet ); $i-> setpixel( x => $x, y => $y, color => $c ) } } say time - $t; } { my $i = Imager-> new( xsize => 1000, ysize => 1000 ); my $t = time; for my $y ( 0 .. 999 ) { my $packed_line = ''; for my $x ( 0 .. 999 ) { $packed_line .= pack 'C3x', get_RGB_triplet; } $i-> setscanline( y => $y, pixels => $packed_line ) } say time - $t; } __END__ 5.78085088729858 0.599802017211914
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re^2: Double the speed of Imager->setpixel
by Anonymous Monk on Dec 12, 2022 at 20:17 UTC | |
by Anonymous Monk on Dec 13, 2022 at 07:39 UTC | |
by Anonymous Monk on Dec 14, 2022 at 03:43 UTC | |
by Anonymous Monk on Dec 14, 2022 at 09:47 UTC | |
by Anonymous Monk on Dec 14, 2022 at 16:01 UTC | |
by Anonymous Monk on Dec 17, 2022 at 15:00 UTC |