Perl Imager: как сделать так, чтобы альфа-канал превратился в черное пятно белого? - PullRequest
0 голосов
/ 17 мая 2018

Я написал этот код для преобразования изображения 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' );

При передаче PNG с альфа-каналом (прозрачным) фон становится черным. То, что я хотел бы сделать, это сделать его белым.

Любопытно, если я просто напишу:

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

JPEG имеет белый фон, но, конечно, он не масштабируется до нужного мне размера.

Ответы [ 2 ]

0 голосов
/ 11 сентября 2018

После предложения автора 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 для сохранения делает свое дело.

0 голосов
/ 17 мая 2018

Я не знаком с модулем Perl Imager , но я просмотрел документацию и не могу найти ничего, связанного с настройкой цвета фона, что происходит в других пакетах (например, gd *).1004 *, ImageMagick ) в прозрачные пиксели, когда вы отключаете альфа-маску.

Простите, если это на много мрачнее, чем любые другие мои ответы, но это может помочь вам начать.Я думаю вам может потребоваться сделать следующее:

  • создать новое белое изображение (без альфа) того же размера, что и ваш PNG
  • , составить ваше изображениеповерх нового белого фона

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

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

Вам может также необходимо добавить mask=>$imgк аргументам, и вам может также нужно поэкспериментировать с opacity=>0.5 или 1.0 или 0.0.

Если кто-то знает лучше, просто скажите мне, и я удалю этот ответ!

...