Abgerundet transparent _smooth_ Ecken mit imagecopyresampled() PHP-GD

Ich brauche ein script, das macht die abgerundeten transparenten Ecken auf dem Bild geliefert. Ich hab eines gefunden und es funktioniert gut, außer der einen Sache: die angewandte Ecken nicht sehen glatt aus. Die imageantialias() wirft Fatal Error da PHP läuft auf Debian und re-kompilieren ist es nicht eine option.

Den trick, den ich gefunden habe, um die Ecken glatt ausschaut, ist die Größe des Bildes mit imagecopyresampled() wie die folgenden:

  1. image vorbereiten;
  2. imagecopyresample es 10x Größe;
  3. zeichnen Sie die Ecken mit einer besonderen Farbe;
  4. machen, dass die Farbe transparent;
  5. verkleinern Sie das Bild auf seine ursprüngliche Größe

Aber hier kommt das problem: die Ecken des Ergebnis-Bild (nach Schritt 5) sind glatt, aber nicht transparent. Beim senden an die Ausgabe das Bild nach Schritt 4 (also vor ab es ist in der Größe) – alles ist wie es sein sollte.

Hier ist der Teil, der code dafür verantwortlich, Ecken abgerundet:

 //$dest = image-Ressource 


$q=10; 
//machen alles 10x größer 
$new_width=$width*$q; 
$new_height=$height*$q; 
$radius=$radius*$q; 

$vergrößert=imagecreatetruecolor($new_width, $new_height); 
imagecopyresampled($vergrößert, $dest, 0,0, 0,0, $new_width,$new_height, ($new_width/$q),($new_height/$f)); 

//aufnehmen der einzigartigen Farbe 
$gefunden = false; 
while($gefunden == false) { 
$r = rand(0, 255); 
$g = rand(0, 255); 
$b = rand(0, 255); 
wenn(imagecolorexact($vergrößert, $r, $g, $b) != (-1)) { 
$gefunden = true; 
} 
} 
$colorcode = imagecolorallocate($vergrößert, $r, $g, $b); 

//Zeichnung Ecken 
imagearc($vergrößert, $radius-1, $radius-1, $radius*2, $radius*2, 180, 270, $colorcode); 
imagefilltoborder($vergrößert,, 0, 0, $colorcode, $colorcode); 
imagearc($vergrößert, $new_width-$radius, $radius-1, $radius*2, $radius*2, 270, 0, $colorcode); 
imagefilltoborder($vergrößert, $new_width-1, 0, $colorcode, $colorcode); 
imagearc($vergrößert, $radius-1, $new_height-$radius, $radius*2, $radius*2, 90, 180, $colorcode); 
imagefilltoborder($vergrößert, 0, $new_height-1, $colorcode, $colorcode); 
imagearc($vergrößert, $new_width-$radius, $new_height-$radius, $radius*2, $radius*2, 0, 90, $colorcode); 
imagefilltoborder($vergrößert, $new_width-1, $new_height-1, $colorcode, $colorcode); 

//machen die einzigartige Farbe transparent 
imagecolortransparent($vergrößert, $colorcode); 

//verkleinert das vergrößerte Bild auf die ursprüngliche Größe 
//erwartet Ecken transparent bleiben 
imagecopyresampled($dest, $vergrößert, 0,0, 0,0, ($new_width/$q),($new_height/$q"), $new_width,$new_height); 
//aber Sie sind nicht 
//senden $vergrößerten Ausgabe für Testzwecke 
$dest=$vergrößert; 

//Ausgabe $dest als image/png

So wie Sie sehen können, das problem tritt auf, wenn vergrößerte Bild wird imagecopyresampled zu seiner ursprünglichen Größe. Die transparenten Ecken gefüllt mit den $colorcode Farbe. Ich habe das Spiel mit imagesavealpha() und imagealphablending() als empfohlen, aber ohne Ergebnis.

Bitte helfen Sie mir, um diese Arbeit zu machen.

P. S. Diese können hilfreich sein: beim Upload der große PNG zu imgur.com er hatte es in JPG umgewandelt und wie Sie sehen können, alle Ecken bekam gefüllt mit, die sehr restauriert $colorcode.

P. S. Hoffe ich werde nicht gebannt für übernutzung das Wort "Erweiterung" 🙂

  • Diese Linie führt zu tödlichen Fehler, wenn Sie große W/H (vergessen Sie nicht, dass immer mehr original-W/H mit 10)... $magnified=imagecreatetruecolor($new_width, $new_height);. Drücken Sie die Speicher-limits (oder Grenzen, die Sie gesetzt haben, in php.ini).
  • Ich habe ein vordefiniertes array von Bild-Typen, die ich brauchen kann, enthält Informationen über Breite, Höhe und Ecken. Ich habe immer imageantialias() schwerwiegender Fehler vor tricks mit der Bild-Größe, so dass ich sicher bin, dass das Debian-Problem.
InformationsquelleAutor aexl | 2011-04-23
Schreibe einen Kommentar