這是一個有點棘手的想法,但我們走了。我會告訴你我做了什麼來得到結果,而不僅僅是它的工作原理。
我正在使用具有您的起始顏色(100, 99, 193)
的小圖像。
在我的程序的頂部我會一直有這樣的代碼。
use strict;
use warnings;
use Data::Printer;
use Image::Magick;
my $p = new Image::Magick;
$p->Read('33141038.jpg');
my @pixel = $p->GetPixel(
x => 1,
y => 1,
map => 'RGB',
normalize => 1,
);
我檢查了the documentation at imagemagick.org.。它鏈接在Image::Magick on CPAN。我在那裏搜索GetPixel
。這會產生兩件有用的事情。一個是解釋,另一個an example表明返回數組@pixel
,而不是像你嘗試的標量。
在這裏,我們減少一半的紅色成分的在(1,1)的強度:
@pixels = $image->GetPixel(x=>1,y=>1);
確定。讓我們使用它。我已經在上面的代碼中獲得了@pixel
。請注意,我也打開了normalize
選項。您可以將它保留爲默認狀態。
p @pixel;
# [
# [0] 0.392156862745098,
# [1] 0.388235294117647,
# [2] 0.756862745098039
# ]
所以那些花車。一些谷歌搜索後,我發現this answer,處理類似的東西。它看起來像是255
的一小部分。我們乘以。我們可以通過在後綴foreach
中指定$_
來修改@pixel
中的內容。那很整齊。
$_ *= 255 foreach @pixel;
p @pixel;
# [
# [0] 100,
# [1] 99,
# [2] 193
# ]
這就是我們想要的。很簡單。我們分別添加一個。
$_ = ($_ * 255) + 1 foreach @pixel;
p @pixel;
# [
# [0] 101,
# [1] 100,
# [2] 194
# ]
還不錯。但是,我們如何恢復?在Manipulate section中,文檔有一些關於SetPixel
的說法。
顏色=>浮子的數組值
[...]
設置單個像素。默認情況下,標準化的像素值是預期的。
顯然我們需要回到浮動狀態。沒問題。
$_ = (($_ * 255) + 1)/255 foreach @pixel;
p @pixel;
# [
# [0] 0.396078431372549,
# [1] 0.392156862745098,
# [2] 0.76078431372549
# ]
不錯。我們當然也可以使數學稍微短一些。結果是一樣的。
$_ = $_ + 1/255 foreach @pixel;
現在讓我們把它寫回圖像。
$p->SetPixel(
x => 1,
y => 1,
color => \@pixel, # need the array ref here
);
$p->Write('my_new_file.jpg');
在截圖中,我改變了它添加20
,而不是1
所以它更加明顯。
清理代碼後看起來是這樣的。
use strict;
use warnings;
use Data::Printer;
use Image::Magick;
my $p = new Image::Magick;
$p->Read('33141038.jpg');
my @pixel = $p->GetPixel(
x => 1,
y => 1,
);
# increase RGB by 1 each
$_ = $_ + 1/255 foerach @pixel;
$p->SetPixel(
x => 1,
y => 1,
color => \@pixel,
);
$p->Write('my_new_file.jpg');
我從GetPixel
刪除map
和channel
參數和SetPixel
爲RGB
是默認的。 normalize
也是如此。
這很有趣。 :) – simbabque