2012-03-08 49 views
2

假設我想拍攝一張圖片,請將其所有像素向右移一個像素,然後保存一個像素。我想這樣的代碼:使用Perl修改圖像中的像素

my $image_file = "a.jpg"; 
my $im = GD::Image->newFromJpeg($image_file); 
my ($width, $height) = $im->getBounds(); 
my $outim = new GD::Image($width, $height); 

foreach my $x (1..$width) 
{ 
    foreach my $y (1..$height) 
    { 
     my $index = $im->getPixel($x-1,$y-1); 
     my ($r,$g,$b) = $im->rgb($index); 
     my $color = $outim->colorAllocate($r,$g,$b); 
     $outim->setPixel($x,$y,$color); 
    } 
} 
%printing the picture... 

這並不做的伎倆;它以一種顏色繪製除x = 0或y = 0之外的所有像素。我哪裏錯了?

回答

4

看的文檔:通過讀取JPEG圖像將永遠是真彩創建

圖像。以 強制圖像爲基於調色板,在可選 $ truecolor參數中傳遞值0。

它沒有編入索引。嘗試將,0添加到您的newFromJpeg調用中。

從評論,看來你的下一個問題是分配的顏色數量。默認情況下,索引圖像是8位,即最大數量爲256個唯一顏色(2^8 = 256)。 「簡單」解決方法當然是使用真彩色圖像,但這取決於您是否可以接受真彩色輸出。

如果沒有,您的下一個挑戰將是提出「最佳」256色的設置,以最大限度地減少圖像本身的可見缺陷(請參閱http://en.wikipedia.org/wiki/Color_quantization)。過去這本來就是我們今天很少擔心的整個話題。如果您仍然需要擔心,那麼您可能更適合將這項工作卸載到像Imagemagik或類似工具這樣的專門工具上,而不是嘗試自己實現它。除非你喜歡挑戰。

+0

感謝您的回答,很顯然,我沒有得到任何地方,其中x = 0或y = 0,但爲什麼其餘的是一種顏色,而第一張圖片是彩色的? – ronash 2012-03-08 19:29:43

+0

您是否嘗試過「打印」原始圖像,以確保它被正確讀取? – 2012-03-08 19:36:47

+0

是的,它確實打印完全相同的圖像。 – ronash 2012-03-08 19:38:27

0

嘗試顛倒x和y的方向 - 不是從1到max,而是從max到1.您不滑動顏色,而是一次又一次地複製顏色。

2

這是一個使用Imager的解決方案,因爲它是一個非常好的模塊,我對它更加熟悉,它很好地處理圖像轉換。

use Imager; 

my $image_file = "a.jpg"; 

my $src = Imager->new(file => $image_file) or die Imager->errstr; 

my $dest = Imager->new(
    xsize => $src->getwidth() + 1, 
    ysize => $src->getheight() + 1, 
    channels => $src->getchannels 
); 

$dest->paste(left => 1, top => 1, src => $src); 
$dest->write(file => "b.jpg") or die $dest->errstr;