круговое изображение с изображением

Пытаясь взять прямоугольную фотографию, обведите ее в квадратную область, а затем замаскируйте в кружок с прозрачным фоном.

//$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}

Грубый ожидаемый результат:

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

Изображение, которое я получаю, выглядит примерно как входное изображение.

Solutions Collecting From Web of "круговое изображение с изображением"

Результат кода

Это работает для меня:

 <?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! 

Большое спасибо всем предыдущим ответам и вкладчикам, которые привели меня к этому коду!

Не стесняйтесь тестировать / комментировать мое решение!