【问题标题】:Perl Image::Resize module, and PNG imagesPerl Image::Resize 模块和 PNG 图像
【发布时间】:2020-03-07 03:20:12
【问题描述】:

我试图弄清楚如何使用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 的大小要小得多)

【问题讨论】:

  • 既然你得到了一个GD::Image,你就可以使用它的方法来检查和改变事情。先看看透明度是否设置正确,然后在打印之前如何使其呈现为白色。

标签: perl


【解决方案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 可能会通过链接到this post 导致直接答案 :启用saveAlpha() GD 设置。

感谢Wick 的评论。

【讨论】:

  • 感谢您的示例。您是否建议类似:my $image = Image::Resize->new($read_path); my $white = $image->colorAllocate(255,255,255); $image->transparent($white); $image->interlaced('true'); my $gd = $image->resize(1000,1000); 因为这似乎不起作用:(
  • @AndrewNewby 类似的东西,是的。我会先调整大小然后设置背景。问题是您的结果显然会在其他地方拾取黑色背景。这与调整大小无关。对此的回答是使用GD::Image——你当然可以用它来解决它(注意这是GD 模块,它的全部)。我想您需要确定将其设置为黑色的原因(以及何时)。
  • 谢谢。我最终做了一些肮脏的修改,通过使用 imagemagick 将其从 PNG 转换为 JPG:``convert "$read_path" -background white -flatten "$path/$filename";。 TBH,无论如何,这可能是最好的选择 - 因为与 PNG 相比,JPG 的文件大小要小得多
  • stackoverflow.com/questions/4900766/… ... 需要启用 saveAlpha() GD 设置。
  • @AndrewNewby 注意上面的评论。我在答案的末尾添加了一条注释。
【解决方案2】:

奇怪的是,3 年后,在对 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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-04
    • 1970-01-01
    相关资源
    最近更新 更多