开发者

Setting Background Color in Perl Magick Image Conversion

I am using Perl Magick which is the Perl module for Image Magick to convert images from GIF and PNG to JPEG. Everything works perfectly until I try to convert an image with a transparent background.

The default behavior for the Resize() function is to use black which ruins the images we are trying to convert. I want to instead change the default background color to white and can't figure out how to do it.

If you use Image Magick on the command line you can change the background by using:

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

And here is the perl code I am using to resize and convert the image:

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

I tried the following to get it to work but to no avail:

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");

And also:

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

I'd appreciate any help on figuring out how to set the defaul开发者_JAVA技巧t background color successfully for the Perl Magick Resize() method. Thanks in advance for your help!


I think the easiest way to convert transparent regions to white is to paste the image on top of a white background before resizing it:

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');

I tested this with Graphics::Magick (a faster fork of ImageMagick) but it should work the same with Image::Magick.

I have tried to do similar image mangling in the past and the above was the best I could come up with.


Unfortunately I wasn't able to get this to work in a clean way that simply used the Resize() method and passed it an appropriate parameter to set the background color.

Instead what I've done to solve the problem is first convert the file to JPG format and then resize it afterwards. This works since the default background color for Image Magick is white so the background is set correctly during the conversion and then the Resize() method simply uses the JPG image without having to do any interpretation.

Not the ideal solution in my estimation but it does work reliably.


Did you try

$image->Flatten(background => 'white'); 
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜