Bei der Verwendung von PHP zum Verarbeiten von Bildern ist ImageAntialias () eine häufige Funktion, um Anti-Aliasing zu ermöglichen, um die Bild-Glätte zu verbessern, insbesondere beim Zeichnen von Linien oder Formen. Wenn viele Entwickler diese Funktion verwenden, um Bilder mit Text zu rendern, werden sie feststellen, dass der Text an den Kanten noch immer zackig ist, was nicht glatt genug aussieht, um den idealen visuellen Effekt zu erzielen. Warum ist das? In diesem Artikel werden die Einschränkungen der Funktion der Bildungstialias () in PHP und die richtige Art und Weise, mit dem Rendering von Text zu befassen, eingehend untersucht.
ImageAntialias () ist eine Funktion der GD -Bibliothek. Seine Hauptfunktion besteht darin, die Anti-Aliasing-Funktion zu ermöglichen und den Effekt der Kantenanzeige von geometrischen Figuren wie Linien und Kreisen im Bild zu verbessern. Wie man es benutzt, ist wie folgt:
$image = imagecreatetruecolor(400, 200);
imageantialias($image, true);
Führen Sie nach dem Aufrufen dieser Funktion Zeichenvorgänge wie Imagine () , ImageSellipse () usw. durch, und Sie werden feststellen, dass die Kanten reibungsloser sind. Dies wird durch den Bildmischungsalgorithmus in der GD -Bibliothek erreicht.
Das Schlüsselproblem ist: ImageAntialias () ist ungültig für den Text, der von der Funktion von Imagettftext () gezeichnet wird .
In der GD -Bibliothek erfolgt die Textzeichnung durch die Funktion imageettftext () , die Text mithilfe der TrueType Font -Datei ( .ttf ) auf ein Bild auf ein Bild rendert. Zum Beispiel:
$font = '/path/to/font.ttf';
imagettftext($image, 20, 0, 50, 100, $color, $font, 'Hello World');
Obwohl Sie vor dem Zeichnen imagesantialias () aufrufen, führt die GD-Bibliothek keine zusätzliche Anti-Aliasing des Textausgangs von Imagettftext () durch. Das Anti-Aliasing-Verhalten der Schriftart selbst wird von der Freetype-Bibliothek kontrolliert und hat keine direkte Beziehung zu ImageAntialias () .
Wenn GD ImagettFtext () nennt, wird die zugrunde liegende Abhängigkeit von der Freetype-Bibliothek zum Rendern von Text und Freetype standardmäßig einen eigenen Anti-Aliasing-Mechanismus ermöglicht. Dieser Anti-Aliasing-Mechanismus wird durch GD-Bildtyp- und Farbverarbeitungsfunktionen begrenzt:
Wenn Sie ein Bild verwenden, das von ImagecrreatTueColor () (d. H. Eine 24-Bit-Karte) erstellt wurde, hat der von Freestyle gerendende Text einen bestimmten Anti-Aliasing-Effekt, ist jedoch immer noch nicht so glatt wie Vektorgrafiken.
Wenn Sie ein von ImageCreate () erstellter Palettenbild (8-Bit) verwenden, verfügt der Text im Grunde nicht mit Anti-Aliasing-Funktionen.
Wenn Sie also feststellen, dass dieser Text schlecht gezackt ist, stellen Sie zunächst sicher, dass Sie ein Truecolor -Bild verwenden.
Wenn Sie einen Text -Rendering -Effekt von höherer Qualität erzielen möchten, können Sie Folgendes ausprobieren:
$image = imagecreatetruecolor(400, 200);
Truecolor-Bilder bieten eine höhere Farbtiefe und eine bessere Unterstützung für die Anti-Aliasing-Renderung.
Eine Problemumgehung besteht darin, zuerst Text auf ein hochauflösendes Bild zu zeichnen und dann das Bild zu verkleinern, um einen Glättungseffekt zu erzielen:
$scale = 4;
$largeImage = imagecreatetruecolor(800, 400); // vergrößern4Doppelt
$color = imagecolorallocate($largeImage, 0, 0, 0);
imagettftext($largeImage, 80, 0, 200, 300, $color, $font, 'Hello');
$smallImage = imagecreatetruecolor(200, 100);
imagecopyresampled($smallImage, $largeImage, 0, 0, 0, 0, 200, 100, 800, 400);
header('Content-Type: image/png');
imagepng($smallImage);
imagedestroy($largeImage);
imagedestroy($smallImage);
Diese Methode simuliert Anti-Aliasing-Effekte, indem sie das Bild manuell skalieren, und der tatsächliche Effekt ist oft besser als das direkte Rendering.
GD selbst verfügt über begrenzte Funktionen zur Rendering von Text. Wenn die Anforderungen an die Bildqualität hoch sind, wird empfohlen, Imagick (basierend auf ImageMagick) zu verwenden:
$imagick = new Imagick();
$imagick->newImage(400, 200, new ImagickPixel('white'));
$draw = new ImagickDraw();
$draw->setFont('Arial');
$draw->setFontSize(20);
$draw->setFillColor(new ImagickPixel('black'));
$imagick->annotateImage($draw, 50, 100, 0, 'Hello World');
$imagick->setImageFormat('png');
header('Content-Type: image/png');
echo $imagick;
Imagick unterstützt die vektorisierte Zeichnung und detailliertere Anti-Aliasing, die für die Erzeugung hochwertiger Bilder geeignet sind.
Obwohl Imagesantialias () im Umgang mit grundlegenden Grafiken sehr effektiv ist, beeinflusst es den Anti-Aliasing-Effekt der Textrendern nicht . Ob der mit ImagettFtext () in PHP verwendete Text glatt ist, hängt von den folgenden Faktoren ab:
Ob der Bildtyp Truecolor ist;
Die Qualität der Schriftart selbst;
Ob die Skalierungsoptimierungsrendern verwendet werden soll;
Ob Sie eine fortgeschrittenere Bildbibliothek wie Imagick verwenden.
Nachdem wir diese Einschränkungen verstanden haben, können wir Tools und Methoden zielgerichtet auswählen, um Bildausgabe zu generieren, die unseren Anforderungen entsprechen. Wenn Sie bei der Erstellung von Bildüberprüfungscodes, dem Austausch von Bildern oder Textwasserzeichen auf Qualitätsprobleme stoßen, können Sie mit diesen Aspekten ebenfalls optimieren.
Besuchen Sie beispielsweise die folgende Adresse, um die Auswirkungen der Bildskalierungsoptimierung zu sehen: