2

我正在使用Perl Magick,它是 Image Magick 的 Perl 模块,用于将图像从 GIF 和 PNG 转换为 JPEG。在我尝试转换具有透明背景的图像之前,一切正常。

Resize() 函数的默认行为是使用黑色,这会破坏我们尝试转换的图像。我想将默认背景颜色更改为白色,但不知道该怎么做。

如果您在命令行上使用 Image Magick,您可以使用以下方法更改背景:

convert image.gif -background \#FFFFFF -flatten image.jpg

这是我用来调整图像大小和转换图像的 perl 代码:

use Image::Magick;
my $image = Image::Magick->new();
$image->Read("input.png");
$image->Resize(geometry=>'500x');
$image->Write("output.jpg");

我尝试了以下方法以使其正常工作,但无济于事:

use Image::Magick;
my $image = Image::Magick->new();
$image->Read("input.png");
$image->Set(background => 'white'); 
$image->Flatten();
$image->Resize(geometry=>'500x');
$image->Write("output.jpg");

并且:

use Image::Magick;
my $image = Image::Magick->new();
$image->Read("input.png");
$image->Resize(geometry=>'500x',background=>'white');
$image->Write("output.jpg");

对于如何为 Perl Magick Resize() 方法成功设置默认背景颜色的任何帮助,我将不胜感激。在此先感谢您的帮助!

4

3 回答 3

4

我认为将透明区域转换为白色的最简单方法是在调整大小之前将图像粘贴到白色背景上:

use Image::Magick;

sub dims {
    my ($image) = @_;
    return $image->Get('width') . 'x' . $image->Get('height');
}

# First grab the image to be mangled.
my $image = Image::Magick->new();
$image->Read('input.png');

# Then, create a white image with the same size.
my $bg = Image::Magick->new(size => dims($image));
$bg->Read('xc:#ffffff');

# And overlay the original on top of it to fill the transparent pixels
# with white.
$bg->Composite(compose => 'Over', image => $image);

# Finally, continue on as normal using $bg instead of $image.
$bg->Resize(geometry => '500x');
$bg->Write('output.jpg');

我用Graphics::Magick(ImageMagick 的一个更快的分支)对此进行了测试,但它应该与Image::Magick相同。

我过去曾尝试过类似的图像处理,以上是我能想到的最好的。

于 2011-02-12T03:37:33.600 回答
1

不幸的是,我无法以一种简洁的方式使其工作,仅使用 Resize() 方法并将其传递给适当的参数来设置背景颜色。

相反,我为解决问题所做的就是首先将文件转换为 JPG 格式,然后再调整其大小。这是有效的,因为 Image Magick 的默认背景颜色是白色,因此在转换过程中正确设置了背景,然后 Resize() 方法只需使用 JPG 图像,而无需进行任何解释。

在我的估计中不是理想的解决方案,但它确实可以可靠地工作。

于 2011-02-22T18:55:53.360 回答
0

你试过了吗

$image->Flatten(background => 'white'); 
于 2011-02-11T20:31:13.503 回答