2012-03-08 58 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;