Perl Image :: Magick Метод для создания тени (без командной строки) - PullRequest
0 голосов
/ 29 января 2011

Я нашел эту версию PHP, которая, кажется, результат, который мне нужен.

    <?php

try
{

    /*** a new Imagick object ***/
    $im = new Imagick('images/spork.jpg');

    /*** set the image format to png ***/
    $im->setImageFormat('png');

    /*** an object for the drop shadow ***/
    $shadow = $im->clone();

    /*** an object for the drop shadow ***/
    $drop_shadow = $im->clone();

    /*** set shadow color to black ***/
    $drop_shadow->setImageBackgroundColor( new ImagickPixel( 'black' ) );

    /*** Create the shadow ***/
    $drop_shadow->shadowImage( 80, 3, 5, 5 );

    /*** stick them together ***/
    $drop_shadow->compositeImage( $im, Imagick::COMPOSITE_OVER, 0, 0 );

    /*** write image to disk ***/
    $drop_shadow->writeImage( '/tmp/dropshadow.png' );

    echo 'Wrote Image';
}
catch(Exception $e)
{
    echo $e->getMessasge();
}
?>

(Пытался опубликовать изображение, не позволил бы мне.) Пример здесь: Spork с тенью

Теперь я достиг нужных мне результатов, используя это в Perl (с другим изображением):

#!/usr/bin/perl -w
use strict;
my imageurl='http://nonprofit.org/images/someimage.jpg';
my $contact='email@email.org';
system("montage $imageurl -geometry 476x356  -background '#F7F7F7' -quality 90 -fill '#ffffff' -shadow \ -stroke '#000C' -strokewidth 2 -gravity SouthWest -font Candice -pointsize 14  -annotate +2+1 '$contact' \ -stroke none -fill white -gravity SouthWest -font Candice -pointsize 14  -annotate +2+2 '$contact' \ -gravity center $new");

system("montage $new -geometry 480x360  -background '#F7F7F7' -quality 90 -fill '#F7F7F7' $new");

Что дает мне хорошее изображение с затененным соотношением сторон (ed), центрированное в коробке / холсте 480x360, которое соответствует страницам bgcolor f7f7f7.

Теперь я хочу сделать это без использования системного метода.

Итак, я попробовал это:

        #!/usr/bin/perl -w
        use Image::Resize;
        use Image::Magick;
        use strict;
        my imageurl='http://nonprofit.org/images/someimage.jpg';
        my $contact='email@email.org';
        my $ibig = Image::Magick->new;
        $ibig->Read("$imageurl");
        $ibig->Resize(geometry=>'476x356');
        $ibig->Montage(geometry=>'476x356',
          background=>'#F7F7F7',
          quality=>90,gravity=>'center',
          shadow=>80x4+4+4); 
    #tried shadow=>'true'  and '1' and many other variations.
     $ibig->Annotate(text=>$contact,
          x=>2,y=>1,
          font=>'Candice',
          pointsize=>14,
          stroke=>'#000C',
          strokewidth=>2,
          gravity=>'SouthWest');

    $ibig->Annotate(text=>$contact,
          x=>2,y=>2,
          font=>'Candice',
          pointsize=>14,
          fill=>'#ffffff',
          stroke=>'none',
          gravity=>'SouthWest');

     $ibig->Montage(geometry=>'480x360',
          background=>'#F7F7F7',
          quality=>90,
          fill=>'#F7F7F7');

$ibig->Write("$new");

Что не работает. Аннотирование работает, но без тени, и изображение обычно заканчивается 479x360.

Системный метод работает безупречно, но я действительно хочу узнать, как это сделать, на моем примере Image :: Magick.

Я провел два дня, исследуя это и читая человека.

Когда я не могу понять это, я перехожу к stackoverflow и ВСЕГДА получаю решение!

Заранее спасибо.

(Извините за проблемы с форматированием. Я пытался его почистить.)

1 Ответ

0 голосов
/ 29 января 2011

Montage() возвращает новое изображение.Попробуйте:

$ibig = $ibig->Montage(...)

Документация , к сожалению, явно не упоминает об этом, но на этой странице есть несколько примеров, которые показывают это.

...