2017-03-14 4 views
0

Je suis en train de faire ce qui suit dans imagick et je ne peux pas le faire fonctionner:Redimensionner l'image et la place dans le centre de la toile

Vérifiez si l'image est élevée sur 390 pixels, si elle est redimensionne alors il à 390 pixels de haut, si ce n'est pas garder les dimensions.

Ajoutez une toile blanche de 300 pixels de largeur sur 400 pixels de hauteur, puis placez l'image au centre de celle-ci.

code Mon est:

$im = new imagick("test.jpg"); 
$imageprops = $im->getImageGeometry(); 
$width = $imageprops['width']; 
$height = $imageprops['height']; 
if($height > '390'){ 
$newHeight = 390; 
$newWidth = (390/$height) * $width; 
}else{ 
$newWidth = $imageprops['width']; 
$newHeight = $imageprops['height']; 
} 

$im->resizeImage($newWidth,$newHeight, imagick::FILTER_LANCZOS, 0.9, true); 

$canvas = new Imagick(); 
$canvas->newImage(300, 400, 'white', 'jpg'); 
$canvas->compositeImage($im, imagick::COMPOSITE_OVER, 100, 50); 

$canvas->writeImage("test-1.jpg"); 

Lorsque les images sont produites les grandes sont mises à l'échelle à 388 pixels de haut pour une raison quelconque et les petits sont laissés à leurs dimensions d'origine.

La mise en place sur le canevas est toujours incorrecte bien que le travail sur les grandes images avec 100,50 soit ajouté à l'image composite.

La plupart des images sont grandes et minces, mais certaines sont plus larges que hautes.

Des idées où je me trompe?

Merci,

Rick

+0

Vous pouvez trouver plus facile de définir la gravité pour CENTRE, la couleur d'arrière-plan blanc, puis utilisez 'setImageExtent()' pour mettre votre image sur une toile blanche de 300x400. –

+0

'if ($ height> 390)' sans les guillemets. –

Répondre

1

commentaires de marque peut être la meilleure option. L'étendue respecte la gravité et garantit que l'image finale sera toujours 300x400. Pour placer l'image au centre en utilisant Imagick::compositeImage, vous aurez besoin de calculer le décalage - ce qui est facile puisque vous avez déjà la largeur/hauteur du sujet & images de toile.

$canvas = new Imagick(); 
$finalWidth = 300; 
$finalHeight = 400; 
$canvas->newImage($finalWidth, $finalHeight, 'white', 'jpg'); 
$offsetX = (int)($finalWidth/2) - (int)($newWidth/2); 
$offsetY = (int)($finalHeight/2) - (int)($newHeight/2); 
$canvas->compositeImage($im, imagick::COMPOSITE_OVER, $offsetX, $offsetY);