我正在试图弄清楚如何使用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时有黑色背景)
缩放:
如何判断它在图像上放置白色背景?我查看了联机帮助页,但看不到任何有用的信息:
http://search.cpan.org/dist/Image-Resize/Resize.pm
谢谢!
更新:对于任何有兴趣的人,我最终做的只是使用convert
将它们从.png转换为.jpg;
convert "$read_path" -background white -flatten "$path/$filename"
在这种情况下实际效果更好,因为我们不需要透明度(并且jpg的尺寸要小得多)
答案 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');
$im
是GD::Image
对象,在Image::Resize::resize
返回的情况下。
没有解释特定问题,我不确定你如何选择黑色背景,但如果上述方法没有解决,你会找到GD::Image
的特定解决方案。
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;