2009-04-23 23 views
2

Hello,Php Gd Bild drehen

Ich versuche ein kreisförmiges Bild um die Mitte zu drehen und dann die Seiten abzuschneiden. Ich sehe die Funktion imagerotate, aber sie scheint sich nicht um den Mittelpunkt zu drehen.

Hat jemand irgendwelche Vorschläge?

Vielen Dank.

Update: Da es ein Kreis ist, möchte ich die Kanten abschneiden und meinen Kreis in den gleichen Dimensionen halten.

+0

nur als eine zufällige Bemerkung am Rande, kam PHP erst vor kurzem mit einem Update heraus, dass eine Sicherheitslücke mit GD imagerotate behebt ... dachte nur, dass ein interessanter Leckerbissen war. – KyleFarris

Antwort

3

Die documentation sagt, dass es tut um das Zentrum drehen.

Leider sagt es auch, dass es das Bild skalieren wird, damit es noch passt. Das bedeutet, dass Sie mit dieser Funktion die Größe Ihres internen kreisförmigen Bildes ändern können.

Sie können (relativ einfach) berechnen, wie viel verkleinert wird, und dann das Bild vorher entsprechend skalieren.

Wenn Sie die PHP "ImageMagick" -Funktionen available haben, können Sie diese stattdessen verwenden - sie skalieren das Bild anscheinend nicht.

+0

Wenn Sie zuerst die Größe ändern und dann drehen, sollten Bilder von besserer Qualität erzielt werden. – soulmerge

+0

in der Tat - ja. Die GD-Bilddrehung wird immer eine Verkleinerung sein, also besser zuerst vergrößern. wird bearbeitet, um zu beheben. – Alnitak

0

Nach der PHP-Handbuch imagerotate() Seite:

Das Rotationszentrum ist das Zentrum des Bildes, und das gedrehte Bild wird verkleinert, so dass die ganzen Bild im Zielbild paßt gedreht - die Kanten sind nicht abgeschnitten.

Vielleicht ist das sichtbare Zentrum des Bildes nicht das eigentliche Zentrum?

4

stand ich erfolgreich das Problem mit dem folgenden Code

$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 

Hoffe, es hilft.

Bye