Сделайте фон прозрачным с помощью Image::Magick и Perl

Я создал Perl-скрипт, который рисует баннер с помощью Image::Magick.

# ... some code
my $icon = Image::Magick->new();
$icon->Set(size => '16x16');
$icon->Transparent(color=>'#010101');
$icon->ReadImage($imagepath);
$full_image->Composite( # small icon 
    image=>$icon,
    compose=>'Over',
    opacity=>'99%',
    x=>'12',
    y=>'62',
);
# ... some code

Обычно фон значка (#010101) должен быть прозрачным, но это не удалось... есть идеи, почему это не работает? Или, может быть, что я мог бы использовать вместо этого прозрачного метода?

Изменить. Оба изображения являются PNG файлами. Image::Magick версия 6.7.


person Community    schedule 27.07.2012    source источник
comment
Я думаю, вам, возможно, придется установить прозрачный цвет после того, как вы загрузили изображение из файла. Кстати, $imagepath не должно быть в кавычках. Как сохранить $icon в файл?   -  person Borodin    schedule 28.07.2012
comment
о ... на самом деле $ imagepath - это '/var/......': D, я просто использовал здесь переменную :) .. но я забыл убрать одинарную кавычку: D ... '$imagepath' не сработает. о, как вы можете видеть, я Composite до последней картинки, а затем $full_image->Write( $file ); это :D   -  person    schedule 28.07.2012
comment
EDIT: я попытался изменить его после загрузки :( .. это не имеет значения   -  person    schedule 28.07.2012


Ответы (2)


Я действительно не использовал этот модуль много, но у меня есть пара идей :)

  1. Вы устанавливаете непрозрачность $full_image на 99%. Разве вы не хотели бы, чтобы при меньшем значении изображение было прозрачным?

  2. #P3# <блочная цитата> #P4#
  3. Я бы сначала прочитал изображение, а затем сделал цвет прозрачным (на всякий случай):

    $icon->ReadImage($imagepath);   
    $icon->Transparent(color=>'#010101');
    
  4. (Уродливый хак) Запустите convert как системную команду для образа, а затем загрузите его:

    my $icon = Image::Magick->new();
    $icon->Set(size => '16x16');
    system("convert -transparent '#010101' not_transp.png transp.png");
    $icon->ReadImage('transp.png');
    $full_image->Composite( # small icon 
        image=>$icon,
        compose=>'Over',
        opacity=>'99%',
        x=>'12',
        y=>'62',
    );
    
person terdon    schedule 16.08.2012
comment
до 1.: я пытался установить его, но это не та точка, которую я хотел, это просто сама непрозрачность для полного изображения. :S ... когда он доходит до 100%, он не отображается, то же самое с 1% или 0%. до 2. : то же самое там. Я попробовал непрозрачный метод на картинке. после и до прочтения исходного изображения. нет разницы с 3.: я попробовал это после комментария под моим вопросом. без разницы :(... но все равно спасибо :D - person ; 16.08.2012
comment
после РЕДАКТИРОВАТЬ: О. о, нет, извините ... это довольно уродливо; D, но это работает, да: D ... но должна быть опция с самим perl. - person ; 22.08.2012

Вам нужно указать ImageMagick использовать альфа-канал.

В командной строке это будет -alpha On.

person Kurt Pfeifle    schedule 12.08.2012
comment
извините, но это не работает :(. Я установил альфа-канал на изображение, но разницы не было. - person ; 13.08.2012