PHP Imagick API — перевод команды CLI в Imagick API

Я пытаюсь изменить команды exec imagemagick в этом методе на команды IMagick php:

 public function colortone($input, $color, $level, $type = 0)
 {
    $args[0] = $level;
    $args[1] = 100 - $level;
    $negate = $type == 0? '-negate': '';

    $this->execute("convert 
    {$input} 
    ( -clone 0 -fill '$color' -colorize 100% ) 
    ( -clone 0 -colorspace gray $negate ) 
    -compose blend -define compose:args=$args[0],$args[1] -composite 
    {$input}");
}

Для контекста этот метод взят из этого руководства nettuts по созданию фильтров iamge для Instagram: http://code.tutsplus.com/tutorials/create-instagram-filters-with-php--net-24504

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

Это то, что я придумал...

public function colortone( $color, $level, $type = 0){
    $args[0] = $level;
    $args[1] = 100 - $level;
    $this->_image = new Imagick();
    $this->_image->setOption( 'compose:args', $args[0] . 'x' . $args[1] );
    $this->_image->readImage( $image_loc );


    $negate = $type == 0 ? TRUE : FALSE;

    $this->_image->setImageColorspace ( Imagick::COLORSPACE_RGB ); 
    $_image_clone_1 = clone $this->_image; 
    $_image_clone_1 = $this->colorizeIt( $_image_clone_1, $color, 1.0 );

    $_image_clone_2 = clone $this->_image; 
    $_image_clone_2->setImageColorspace( Imagick::COLORSPACE_GRAY );
    if( $negate )
        $_image_clone_2->negateImage( 0 );

    $this->_image->compositeImage( $_image_clone_1, Imagick::COMPOSITE_BLEND, 0, 0 );
    $this->_image->compositeImage( $_image_clone_2, Imagick::COMPOSITE_BLEND, 0, 0 );
}

Вот метод colorizeIt, используемый выше (поскольку кажется, что родной метод IMagick colorizeImage немного не работает)

public function colorizeIt( $image_obj, $color, $alpha = 1 ){
    $draw = new ImagickDraw();
    $draw->setFillColor($color);

    if (is_float($alpha))
        $draw->setFillAlpha($alpha);        

    $geometry = $image_obj->getImageGeometry();
    $width = $geometry['width'];
    $height = $geometry['height'];

    $draw->rectangle(0, 0, $width, $height);

    $image_obj->drawImage($draw);
    return $image_obj;
}

Вот исходное изображение, за которым следует желаемый результат и фактический результат, который дает мне мой PHP-код:

Исходное изображение

Желаемый результат

И что я получаю...

Как видите, что-то пошло не так. Любая помощь высоко ценится!


person Ste77    schedule 03.02.2015    source источник
comment
Вы можете добавить +write file в середине команды обмена мгновенными сообщениями, чтобы вы могли сравнить свои промежуточные изображения из командной строки с изображениями, сгенерированными PHP... convert image.jpg \( + clone -colorspace gray +write temp1.png \) \( +clone ... +write temp2.png...   -  person Mark Setchell    schedule 03.02.2015
comment
Ваши параметры args выглядят неправильно... почему вы назначаете $args[0] и $args[1] ПОСЛЕ того, как используете $arg1 и $arg2 в setOption(), а затем никогда их больше не используете?   -  person Mark Setchell    schedule 03.02.2015
comment
Показанный здесь код вырван из контекста, и я отредактировал его, чтобы он имел смысл. Забыл про аргументы - сейчас исправлю.   -  person Ste77    schedule 03.02.2015
comment
Кажется, я не могу получить доступ к Convert через CLI. Не похоже, что Imagemagick установлен на сервере — хотя он доступен через PHP — я нахожу это запутанным. Кстати, у меня нет доступа для установки на сервер.   -  person Ste77    schedule 03.02.2015
comment
Какое значение вы передаете для $color?   -  person Mark Setchell    schedule 03.02.2015
comment
Я прохожу в "# 330000"   -  person Ste77    schedule 03.02.2015
comment
И значение $level ?   -  person Mark Setchell    schedule 03.02.2015
comment
$level 100 и $type = 0   -  person Ste77    schedule 03.02.2015


Ответы (1)


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

convert http://i.stack.imgur.com/vqWqd.jpg         \
    \( -clone 0 -fill "#330000" -colorize 100% \)  \
    \( -clone 0 -colorspace gray -negate \)        \
    -compose blend -define compose:args=100x0 -composite output.jpg

и результат таков:

введите здесь описание изображения

Версия: ImageMagick 6.9.0-3 Q16 x86_64 2015-01-15 http://www.imagemagick.org

person Mark Setchell    schedule 03.02.2015
comment
Спасибо Марк, помогает иметь базовый уровень. - person Ste77; 05.02.2015