Perl Image ::调整大小模块和PNG图像

时间:2016-08-11 08:50:22

标签: perl

我正在试图弄清楚如何使用Image::Resize Perl模块来缩小PNG图像。以下代码 工作:

        my $image = Image::Resize->new($read_path);
        my $gd = $image->resize(1000,1000);
        open (DISPLAY,">$write_path") || die "Cant write $write_path, Reason: $!";
            binmode DISPLAY;
            if ($read_path =~ /\.jpg$/i) {           
             print DISPLAY  $gd->jpeg();
            } elsif ($read_path =~ /\.gif$/i) {           
             print DISPLAY  $gd->gif();
            } elsif ($read_path =~ /\.png$/i) {           
             print DISPLAY  $gd->png();
            }
        close DISPLAY;

然而,结果不是我想要的(缩放版本在转换透明PNG时有黑色背景)

原始 enter image description here

缩放:

enter image description here

如何判断它在图像上放置白色背景?我查看了联机帮助页,但看不到任何有用的信息:

http://search.cpan.org/dist/Image-Resize/Resize.pm

谢谢!

更新:对于任何有兴趣的人,我最终做的只是使用convert将它们从.png转换为.jpg;

convert "$read_path" -background white -flatten "$path/$filename"

在这种情况下实际效果更好,因为我们不需要透明度(并且jpg的尺寸要小得多)

2 个答案:

答案 0 :(得分:1)

Image::Resize模块仅执行此操作,调整图像大小。

但是,它确实返回GD::Image个对象。然后,您可以使用gd的全部功效为您的图像。

方法GD::Image::transparent可能正是您要找的。从文档复制

# allocate some colors
my $white = $im->colorAllocate(255,255,255);

# make the background transparent and interlaced
$im->transparent($white);
$im->interlaced('true');

$imGD::Image对象,在Image::Resize::resize返回的情况下。

没有解释特定问题,我不确定你如何选择黑色背景,但如果上述方法没有解决,你会找到GD::Image的特定解决方案。

通过链接This post

this post可以直接回答问题 :启用saveAlpha() GD设置。

感谢Wick发表评论。

答案 1 :(得分:0)

奇怪的是,三年后,在评论了关于saveAlpha()设置的可接受答案之后,我再次遇到了这个问题。这次,我正在使用仅具有Alpha透明度的源PNG。调整大小并另存为JPG时,GD的saveAlpha()或transparent()设置无效。我每次都有可怕的黑色背景。

我要解决的问题是创建一个新图像,应用白色填充矩形作为背景,然后在其顶部应用调整大小的图像:

my $width = 320;
my $height = 240;
my $image = GD::Image->new($width,$height);
my $white = $image->colorAllocate(255,255,255);
$image->filledRectangle(0,0,$width,$height,$white);
$image->saveAlpha(0);

my $gdo = GD::Image->newFromPng("filename.png");
$image->copyResampled($gdo,0,0,0,0,$width,$height,$gdo->width,$gdo->height);

open my $FH,'>',"filename.jpg";
binmode $FH;
print {$FH} $image->jpeg;
close $FH;