Imagick: установка силы тяжести в объекте Imagick

У меня возникают некоторые реальные трудности, связанные с гравитацией изображения в Imagick.

Мне удалось установить гравитацию объекта ImaickDraw, но я не смог установить его в объекте Imagick.

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

$rating = new Imagick("ratings/" . $rating . ".png"); $rating->setGravity (Imagick::GRAVITY_SOUTH); $im->compositeImage($rating, imagick::COMPOSITE_OVER, 20, 20); 

Любые идеи о том, как установить гравитацию для существующего изображения, а не для объекта ничьей?

Благодаря!

В вашем случае метод setGravity должен применяться к объекту $im . Но в любом случае это похоже на то, что гравитация влияет только на объекты ImagickDraw, вставленные с drawImage , и нет никакого способа поместить изображение в ничью, как вы можете сделать с помощью команд ImageMagick.

Итак, есть два способа сделать это:

Первый. Если ваш хостинг позволяет использовать функции shell_exec или exec , вы можете запустить команду вроде.

 convert image.jpg -gravity south -\ draw "image Over 0,0 0,0 watermak.png" \ result.jpg` 

Второй. В противном случае вы можете рассчитать положение изображения, размещаемого на базовом изображении, и использовать compositeImage

 $imageHight = $im->getImageHeight(); $imageWith = $im->getImageWidth(); // Scale the sprite if needed. // Here I scale it to have a 1/2 of base image's width $rating->scaleImage($imageWith / 2, 0); $spriteWidth = $rating->getImageWidth(); $spriteHeight = $rating->getImageHeight(); // Calculate coordinates of top left corner of the sprite // inside of the image $left = ($imageWidth - $spriteWidth)/2; // do not bother to round() values, IM will do that for you $top = $imageHeight - $spriteHeight; // If you need bottom offset to be, say, 1/6 of base image height, // then decrease $top by it. I recommend to avoid absolute values here $top -= $imageHeight / 6; $im->compositeImages($rating, imagick::COMPOSITE_OVER, $left, $top);