linux - How do I increase the RGB value of a specific pixel with Image::Magic in Perl? -
i want 1 pixel (x=3, y=3) , change rgb values (r 100 101, g 99 100, b 193 194).
use strict; use image::magick; $p = new image::magick; $p->read( 'myfile.jpg' ); $pix = $p->getpixel( width => 1, height => 1, x => 3, y => 3, map => 'rgb', normalize => 0 ); # in $pix rgb value now? how add 1 rgb components?
can split decimal rgb 3 values (r,g,b) , increment separately, , merge 3 r,g,b values 1 rgb? :) how do that?
$pix = .... code here... # make changes $p->setpixel( x => 3, y => 3, channel => 'rgb', color => [ $pix ] ); $p->write ('my_new_file.jpg');
this bit tricky figure out, here go. i'll show did result, not how works.
i'm using small image has starting color (100, 99, 193).
at top of program have code.
use strict; use warnings; use data::printer; use image::magick; $p = new image::magick; $p->read('33141038.jpg'); @pixel = $p->getpixel( x => 1, y => 1, map => 'rgb', normalize => 1, ); i checked the documentation @ imagemagick.org.. linked in image::magick on cpan. there searched getpixel. yields 2 helpful things. 1 explanation, other 1 an example shows array @pixel returned, , not scalar tried.
here reduce intensity of red component @ (1,1) half:
@pixels = $image->getpixel(x=>1,y=>1);
ok. let's use that. i've got @pixel in code above. note turned on normalize option. can leave out it's on default.
p @pixel; # [ # [0] 0.392156862745098, # [1] 0.388235294117647, # [2] 0.756862745098039 # ] so floats. after googling found this answer, deals similar. looks fraction of 255. let's multiply. can modify things in @pixel assigning $_ in postfix foreach. that's neat.
$_ *= 255 foreach @pixel; p @pixel; # [ # [0] 100, # [1] 99, # [2] 193 # ] that's wanted. easy enough. let's add 1 each.
$_ = ( $_ * 255 ) + 1 foreach @pixel; p @pixel; # [ # [0] 101, # [1] 100, # [2] 194 # ] still good. how in? docs have setpixel in manipulate section.
color=>array of float values
[...]
set single pixel. default normalized pixel values expected.
so apparently need go float. no problem.
$_ = ( ( $_ * 255 ) + 1 ) / 255 foreach @pixel; p @pixel; # [ # [0] 0.396078431372549, # [1] 0.392156862745098, # [2] 0.76078431372549 # ] nice. can of course make math bit shorter. result same.
$_ = $_ + 1 / 255 foreach @pixel; now let's write image.
$p->setpixel( x => 1, y => 1, color => \@pixel, # need array ref here ); $p->write('my_new_file.jpg'); in screenshot, changed add 20 instead of 1 it's more visible.
after cleaning code looks this.
use strict; use warnings; use data::printer; use image::magick; $p = new image::magick; $p->read('33141038.jpg'); @pixel = $p->getpixel( x => 1, y => 1, ); # increase rgb 1 each $_ = $_ + 1 / 255 foerach @pixel; $p->setpixel( x => 1, y => 1, color => \@pixel, ); $p->write('my_new_file.jpg'); i've removed map , channel arguments getpixel , setpixel rgb default. same normalize.



Comments
Post a Comment