Пытаясь взять прямоугольную фотографию, обведите ее в квадратную область, а затем замаскируйте в кружок с прозрачным фоном.
//$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}
Грубый ожидаемый результат:
Изображение, которое я получаю, выглядит примерно как входное изображение.
Это работает для меня:
<?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');
Вы можете использовать черный круг Imagick как маску, но я, хотя это было не идеально, поэтому я использовал свой собственный.
Конечно, вам, безусловно, придется изменять размер / обрезать изображения, но это еще одна история.
Надеюсь это поможет.
J.
Я наткнулся на это, поскольку я искал аналогичное решение для Ruby on Rails, заметив , что этот вопрос Stackoverflow использует вместо него виньетку, что, по-видимому, является гораздо более простым способом решения проблемы.
Я использовал виньетку, чтобы решить мою проблему с закругленными изображениями в Ruby on Rails с помощью Dragonfly .
Есть еще одно обходное решение, которое я предлагаю здесь:
// 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) $icon->roundCorners(50, 50); // force the png format for transparency $icon->setImageFormat("png"); // write the new image $icon->writeImage('/absolute/path/to/your/new/image'); // done!
Большое спасибо всем предыдущим ответам и вкладчикам, которые привели меня к этому коду!
Не стесняйтесь тестировать / комментировать мое решение!