2009-04-23 7 views
2

HEllo,Php Gd rotate image

J'essaye de faire pivoter une image circulaire autour du centre, puis de couper les côtés. Je vois la fonction imagerotate, mais elle ne semble pas tourner autour du centre.

Quelqu'un a des suggestions?

Merci. Mise à jour: Comme il s'agit d'un cercle, je veux couper les bords et garder mon cercle dans les mêmes dimensions.

+0

Tout comme un sidenote aléatoire, PHP est sorti avec une mise à jour tout récemment qui corrige un bogue de sécurité avec GD imagerotate ... Je pensais juste que c'était une friandise intéressante. – KyleFarris

Répondre

3

Le documentation indique que fait tourner autour du centre.

Malheureusement, il est également dit qu'il mettra à l'échelle l'image afin qu'elle s'adapte toujours. Cela signifie que quoi que vous fassiez, cette fonction changera la taille de votre image circulaire interne.

Vous pouvez (relativement facilement) calculer la réduction qui se produira et ensuite prédéfinir l'image correctement avant. Si vous avez les fonctions PHP "ImageMagick" available, vous pouvez les utiliser à la place - ils ne font apparemment pas évoluer l'image.

+0

Le redimensionnement d'abord et * puis * la rotation devraient donner des images de meilleure qualité. – soulmerge

+0

en effet - oui. l'image GD pivotera toujours vers le bas, il est donc préférable de la mettre à l'échelle en premier. modifiera pour corriger. – Alnitak

0

Selon la page de manuel PHP imagerotate():

Le centre de rotation est le centre de l'image, et l'image pivotée réduite de telle sorte que toute rotation l'image correspond à l'image de destination - les bords ne sont pas écrêtés.

Peut-être que le centre visible de l'image n'est pas le centre réel?

4

J'ai fait face avec succès ce problème avec le code suivant

$width_before = imagesx($img1); 
    $height_before = imagesy($img1); 
    $img1 = imagerotate($img1, $angle, $mycolor); 

    //but imagerotate scales, so we clip to the original size 

    $img2 = @imagecreatetruecolor($width_before, $height_before); 
    $new_width = imagesx($img1); // whese dimensions are 
    $new_height = imagesy($img1);// the scaled ones (by imagerotate) 
    imagecopyresampled(
     $img2, $img1, 
     0, 0, 
     ($new_width-$width_before)/2, 
     ($new_height-$height_before)/2, 
     $width_before, 
     $height_before, 
     $width_before, 
     $height_before 
    ); 
    $img1 = $img2; 
    // now img1 is center rotated and maintains original size 

Hope it helps.

Bye

Questions connexes