Округлить изображение с помощью imagick
Пытаясь сделать прямоугольную фотографию, обрежьте ее в квадратную область, а затем замаскируйте в круглую с прозрачным фоном.
//$dims is an array with the width, height, x, y of the region in the rectangular image (whose path on disk is $tempfile)
$circle = new \Imagick();
$circle->newImage($dims['w'], $dims['h'], 'none');
$circle->setimageformat('png');
$circle->setimagematte(true);
$draw = new \ImagickDraw();
$draw->setfillcolor('#ffffff');
$draw->circle($dims['w']/2, $dims['h']/2, $dims['w']/2, $dims['w']);
$circle->drawimage($draw);
$imagick = new \Imagick();
$imagick->readImage($tempfile);
$imagick->setImageFormat( "png" );
$imagick->setimagematte(true);
$imagick->cropimage($dims['w'], $dims['h'], $dims['x'], $dims['y']);
$imagick->compositeimage($circle, \Imagick::COMPOSITE_DSTIN, 0, 0);
$imagick->writeImage($tempfile);
$imagick->destroy();
В результате получается прямоугольное изображение, не обрезанное и не закругленное. Что я делаю неправильно?
Пример изображения:
Пример ввода для $dims = {"x":253,"y":0,"x2":438.5,"y2":185.5,"w":185.5,"h":185.5}
Грубый ожидаемый результат:
Изображение, которое я получаю, выглядит примерно как входное изображение.
4 ответа
Это работает для меня:
<?php
//$dims is an array with the width, height, x, y of the region in the rectangular image (whose path on disk is $tempfile)
$tempfile = 'VDSlU.jpg';
$outfile = 'blah.png';
$circle = new Imagick();
$circle->newImage(185.5, 185.5, 'none');
$circle->setimageformat('png');
$circle->setimagematte(true);
$draw = new ImagickDraw();
$draw->setfillcolor('#ffffff');
$draw->circle(185.5/2, 185.5/2, 185.5/2, 185.5);
$circle->drawimage($draw);
$imagick = new Imagick();
$imagick->readImage($tempfile);
$imagick->setImageFormat( "png" );
$imagick->setimagematte(true);
$imagick->cropimage(185.5, 185.5, 253, 0);
$imagick->compositeimage($circle, Imagick::COMPOSITE_DSTIN, 0, 0);
$imagick->writeImage($outfile);
$imagick->destroy();
?>
<img src="blah.png">
Я всегда стараюсь сделать код простым, пока не получу его работу, а затем добавлю все переменные и т. Д. Это может быть проблемой или может быть проблемой с вашей версией Imagick.
Это пространство имен
До сих пор не знаю, что это значит! - Я немного отстаю с php, так как не пользуюсь им в наши дни.
Для тех, у кого более старая версия Imagick (setimagematte не существует в версии ниже 6.2.9), я предложил простое решение. Суть в том, чтобы скопировать непрозрачность маски с исходного изображения.
Исходное изображение:
Маска:
Результат:
Код:
$base = new Imagick('original.jpg');
$mask = new Imagick('mask.png');
$base->compositeImage($mask, Imagick::COMPOSITE_COPYOPACITY, 0, 0);
$base->writeImage('result.png');
Вы можете использовать черный круг Имаджика в качестве маски, но я подумал, что он не идеален, поэтому я использовал свой собственный.
Конечно, вам, безусловно, придется изменить размер / обрезать ваши изображения, но это уже другая история.
Надеюсь это поможет.
J.
Есть также другой обходной путь, который я предлагаю здесь:
// create an imagick object of your image
$image = new \Imagick('/absolute/path/to/your/image');
// crop square your image from its center (100px witdh/height in my example)
$image->cropThumbnailImage(100, 100);
// then round the corners (0.5x the width and height)
$image->roundCorners(50, 50);
// force the png format for transparency
$image->setImageFormat("png");
// write the new image
$image->writeImage('/absolute/path/to/your/new/image');
// done!
Большое спасибо всем предыдущим ответам и авторам, которые привели меня к этому коду!
Не стесняйтесь тестировать / комментировать мое решение!
Я наткнулся на это, когда искал похожее решение для Ruby on Rails, и заметил, что в этом вопросе Stackru вместо этого используется виньетка, которая кажется гораздо более простым способом решения проблемы.
Я использовал виньетирование, чтобы решить мою проблему с закругленными изображениями в Ruby on Rails, используя Dragonfly.