Настройка цвета фона в Perl Magick Преобразование изображения - PullRequest
1 голос
/ 11 февраля 2011

Я использую Perl Magick , который является модулем Perl для Image Magick для преобразования изображений из 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 (). Заранее спасибо за помощь!

Ответы [ 3 ]

4 голосов
/ 12 февраля 2011

Я думаю, что самый простой способ преобразовать прозрачные области в белый - это вставить изображение поверх белого фона перед изменением его размера:

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 .

Я пытался сделать подобное искажение изображения в прошлом, и выше было лучшее, что я мог придумать.

1 голос
/ 22 февраля 2011

К сожалению, я не смог заставить это работать чистым способом, просто использовал метод Resize () и передал ему соответствующий параметр для установки цвета фона.

Вместо этого я решил сначала преобразовать файл в формат JPG, а затем изменить его размер. Это работает, так как цвет фона по умолчанию для Image Magick - белый, поэтому фон устанавливается правильно во время преобразования, а затем метод Resize () просто использует изображение JPG без какой-либо интерпретации.

Не идеальное решение для моей оценки, но оно работает надежно.

0 голосов
/ 11 февраля 2011

Вы пробовали

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