2016-06-02 14 views
1

Ich versuche, einen transparenten Text mit imagettftext zu schreiben, aber ich kann nicht (unter Verwendung imagestring funktioniert, aber es ist nicht möglich, Ihre eigene Schriftart und Größen zu wählen). Das endgültige Bild sollte ein graues Rechteck mit transparentem Text sein, so dass, wenn ich das Bild über einen neuen Hintergrund setze, dieser Hintergrund im Text sichtbar ist.PHP GD Bildtttext transparent

Mein Code ist:

$font = "./Verdana.ttf"; 
$fontSize = 12; 
$img = imagecreatetruecolor(600, 600); 
imagealphablending($img, false); 
imagesavealpha($img, true); 
$transparent = imagecolorallocatealpha($img, 255, 255, 255, 127); 
$grey = imagecolorallocate($img, 127, 127, 127); 
imagefilledrectangle($img, 0, 0, $imageX, $imageY, $grey); 
imagettftext($img, $fontSize, 0, $text_posX, $text_posY, $transparent, $font, "This is a transparent text"); 
imagepng($img); 

Antwort

1

Die Lösung hier sollte einfach sein; Wechseln Sie in den Non-Blending-Modus (über imagealphablending($img, false);) und fügen Sie den Text mit einer vollständig transparenten Farbe hinzu. Aber es scheint einen Fehler in PHP zu geben (getestet in 7.0.7, spätestens zum Zeitpunkt des Schreibens), wo dies dazu führt, dass das Text-Rendering als eine Reihe von Rechtecken anstelle von Buchstaben erfolgt.

Eine sehr schnelle und einfache Lösung für diese ist den Farbindex von $transparent zu negieren Anti-Aliasing zu deaktivieren:

imagettftext($img, $fontSize, 0, $text_posX, $text_posY, -$transparent, $font, 'TEST'); 

Aber, wenn Sie den Text lieber als ein Anti-Aliasing können Sie:

  • schaffen ihr Bild mit dem doppelten der gewünschten Größe (Breite × 2, Höhe × 2)
  • fügen Sie den Text aliased die Negation Verfahren, oben
  • Größe ändern Sie das Bild (Breite & teilen; 2, Höhe & teilen; 2) über imagecopyresampled(), um einen grundlegenden Anti-Aliased-Effekt zu fälschen.

Also, im Grunde diese:

$font = "./Verdana.ttf"; 
$fontSize = 24; // note: double your original value. 
$img = imagecreatetruecolor(1200, 1200); // note: double your original values. 
imagealphablending($img, false); 
imagesavealpha($img, true); 
$transparent = imagecolorallocatealpha($img, 255, 255, 255, 127); 
$grey = imagecolorallocate($img, 127, 127, 127); 
imagefilledrectangle($img, 0, 0, $imageX, $imageY, $grey); 
imagettftext($img, $fontSize, 0, $text_posX, $text_posY, -$transparent, $font, "This is a transparent text"); 

$dest = imagecreatetruecolor(600, 600); 
imagealphablending($dest, false); 
imagesavealpha($dest, true); 
imagecopyresampled($dest, $img, 0, 0, 0, 0, 600, 600, 1200, 1200); 

header('Content-Type: image/png'); 
imagepng($dest); 
+0

@ cargarm3 Hat diese Arbeit für Sie? – timclutton

+0

Ja, es hat funktioniert. Vielen Dank. – cargarm3

+0

Ich bin froh, dass ich helfen konnte. Bitte beachten Sie, dass die Etikette von StackOverflow die Antwort, die Ihr Problem gelöst hat, akzeptiert. Weitere Informationen finden Sie unter "[Was soll ich tun, wenn jemand meine Frage beantwortet?] (Https://stackoverflow.com/help/someone-answers)" in der Hilfe. – timclutton