Изменение наклона изображения с помощью ImageMagick в PHP

У меня есть команда, которую я могу запустить в командной строке для изменения наклона изображения с помощью Imagemagick:

convert \( myimage.jpg -gamma 0.75 -modulate 100,130 -contrast \) \( +clone -sparse-color Barycentric "0,0 black 0,%h white" -function polynomial 4,-4,1 -level 0,50% \) -compose blur -set option:compose:args 5 -composite myimage.jpg

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

$image = new imagick("myimage.jpg")
$image->gammaImage(0.75);
$image->modulateImage(100,130,100);
$image->contrastImage(1);

Спасибо!


person Vijay Boyapati    schedule 19.06.2012    source источник
comment
Похоже, вы до сих пор ничего не пробовали для переключения наклона, не так ли? Есть ли многообещающие кандидаты в списке функций imagemagick?   -  person hakre    schedule 19.06.2012
comment
Привет, Хакре, я застрял при воспроизведении последней части командной строки, которую я использовал: (+ clone -sparse-color Barycentric 0,0 black 0,% h white -function polynomial 4, -4,1 -level 0,50% ) -compose blur -set option: compose: args 5 -composite Проблема, с которой я столкнулся, заключается в том, что документация для библиотеки Imagemagick в PHP очень скудна и не содержит примеров, например, sparseColor   -  person Vijay Boyapati    schedule 19.06.2012
comment
Да, пользователям еще нужно добавить туда примеры. Если мы сможем создать здесь хороший пример, мы сможем добавить его позже на страницу руководства. Мне также трудно найти подходящую функцию для некоторых параметров командной строки.   -  person hakre    schedule 20.06.2012
comment
Ага, звучит хорошо. Если я заставлю его работать, я перенесу знания и в документацию по PHPImage.   -  person Vijay Boyapati    schedule 20.06.2012


Ответы (3)


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

http://www.imagemagick.org/Usage/photos/

С учетом сказанного, я пытался сделать то же самое с PHP Imagick. Я использую PHP Imagick 3.0.1 и ImageMagick 6.7.4-4 2012-01-09 Q16 в Linux.

Похоже, что составной режим размытия недокументирован. Я нашел его, просмотрев исходный код ImageMagick под magick/composite.h в строке 88.

Этот код выполняет то, что вы ищете:

$im = new Imagick();
$im->readImageBlob(file_get_contents($src));
$qr = $im->getQuantumRange();
$qr = $qr['quantumRangeLong'];
$im->sigmoidalContrastImage(true, 10, $qr / 2, Imagick::CHANNEL_ALL);
$blurmap = new Imagick();
$blurmap->setOption('compose:args', '5');
$blurmap->newPseudoImage($im->getImageWidth(), $im->getImageHeight(), 'gradient:black-white');
$blurmap->functionImage(Imagick::FUNCTION_POLYNOMIAL, array(4.5, -4.5, 1));
$blurmap->levelImage(0, 1, $qr / 2);
$im->compositeImage($blurmap, 57, 0, 0);
$blurmap->destroy();

Если вам нужно больше размытия, просто измените compose:args на 10 или что-то в этом роде. Одна вещь, которую я понял, заключалась в том, что мне нужно было установить эту опцию до того, как я создал / загрузил что-либо в саму палочку.

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

РЕДАКТИРОВАТЬ: При дальнейшем просмотре сгенерированных изображений я заметил, что даже черные части карты размытия были размыты. После некоторых поисков выяснилось, что это связано с ошибкой, появившейся в ImageMagick. Я переключился на версию 6.7.8-1 2012-07-05 Q16, и теперь карта размытия работает. Если вы заметили нежелательное размытие с помощью композиции размытия, я предлагаю вам обновить ImageMagick.

person tbjers    schedule 05.07.2012

Удачи тебе, Виджей - я рекомендую тебе использовать exec ()

В любом случае просто попробовал, и мой код ниже; вы можете увидеть некоторые изменения, которые я внес, и отказался от них с ошибкой в ​​строке: $ new-> functionImage (FUNCTION_POLYNOMIAL, $ functionImagearray);

// Did not like the %h
// $sparseColorarray = array( 0, 0, black, 0, %h, white );
$sparseColorarray = array( 0, 0, black, 0, 20, white );
$functionImagearray = array( 4, -4, 1 );
$image = new imagick("output3.jpg");
$image->gammaImage(0.75);
$image->modulateImage(100,130,100);
$image->contrastImage(1);
//$new = $image->clone(); 
$new = clone $image; 
$new->sparseColorImage( Imagick::SPARSECOLORMETHOD_BARYCENTRIC, $sparseColorarray );
$new->functionImage ( Imagick::FUNCTION_POLYNOMIAL, $functionImagearray );
// Did not like the %
// $new->levelImage( 0, 50% );
$new->levelImage( 0, 50 );
// Can not find any options for this blur
$image->setImageCompose ( BLUR );
$image->setOption( args, 5);
$image->compositeImage( $new, COMPOSITE_BLEND, 0, 0 );
$image->writeImage( "tilt.jpg" );
$image->destroy();

Прочитав документацию и следуя вашему примеру кода, это то, что я придумал. Я также не смог найти никаких вариантов для $ image-> setImageCompose (BLUR);

Было бы интересно посмотреть, получится ли у вас когда-нибудь работать.

Только что выяснилось, что моя версия Imagick слишком устарела для functionImage

Изменена строка $ new-> functionImage

person Bonzo    schedule 19.06.2012

У меня нет большого опыта работы с ImageMagick, но я считаю, что существует функция, эквивалентная Barycentric с разреженными цветами, которую можно найти в документации здесь.

Это должно выглядеть примерно так:

$image -> sparseColorImage(int SPARSECOLORMETHOD_BARYCENTRIC (integer), 
                           array $arguments [, int $channel = CHANNEL_DEFAULT ])

FUNCTION_POLYNOMIAL и другие константы метода / константы канала можно найти здесь на будущее!

Размытие по Гауссу обрабатывается путем добавления:

$image -> gaussianBlurImage ( float $radius , 
                              float $sigma [, int $channel = CHANNEL_ALL ] )

Конечно, все они очень общие, но вы можете повозиться, чтобы получить желаемый внешний вид.

Надеюсь это поможет!

Мейсон

person MasonWinsauer    schedule 19.06.2012
comment
Привет, Мейсон - к сожалению, это мало помогает. Я прочитал документацию по библиотеке ImageMagick. Ищу конкретные команды. В частности, у меня это не сработало: $ coords = array (0,0,0, $ image- ›getImageHeight ()); $ image- ›sparseColorImage (imagick :: SPARSECOLORMETHOD_BARYCENTRIC, $ coords); - person Vijay Boyapati; 20.06.2012
comment
Какие ошибки возникают, если они есть, когда вы это пробуете? Единственное, что я мог вообразить, это что-то не так, это переданный массив координат. Модель необходимого массива - «array (1,1, 2, 45)», но на самом деле, насколько я знаю ... - person MasonWinsauer; 20.06.2012