Perl Imager:如何让alpha通道变成黑色而不是白色?

问题描述 投票:2回答:2

我编写此代码将PNG图像转换为JPEG:

use Imager;
use strict;

my $img = Imager->new( file => './fsc.png' );
$img = $img->convert( preset => 'noalpha' );
$img = $img->scale( xpixels => 100 );
$img->write( type => 'jpeg', file => './fsc.jpg' );

传递带有Alpha通道(透明)的PNG时,背景变为黑色。我想做的是把它变成白色。

奇怪的是,如果我只写:

my $img = Imager->new( file => './fsc.png' );
$img->write( type => 'jpeg', file => './fsc.jpg' );

jpeg有白色背景,但当然它没有达到我需要的尺寸。

perl image-processing png jpeg alpha-transparency
2个回答
3
投票

我不熟悉Perl的Imager模块,但我查看了文档,找不到与设置背景颜色相关的任何内容,这是在关闭alpha蒙版时其他包(例如gd,ImageMagick)中发生的透明像素。

请原谅我,如果这比其他任何答案都要模糊得多,那么它可能会让你开始。我想你可能需要做以下事情:

  • 创建一个与PNG大小相同的新白色图像(没有alpha)
  • 在新的白色背景上合成您的图像

我怀疑上面的第二步看起来像:

$white = $white->compose(src=>$img)

您可能还需要将mask=>$img添加到参数中,您可能还需要尝试使用opacity=>0.51.00.0

如果有人知道更好,请告诉我,我会删除这个答案!


2
投票

在Imager的作者的建议之后,似乎最直接的解决方案是这样的:

use Imager;

my $img = Imager->new( file => './fsc.png' );
$img = $img->scale( xpixels => 100 );
$img->write( type => 'jpeg', file => './fsc.jpg', i_background => Imager::Color->new("#FFF") );

也就是说,要保存的i_background参数可以解决问题。

© www.soinside.com 2019 - 2024. All rights reserved.