Aktueller Standort: Startseite> Neueste Artikel> Wie verwendet ich die Funktion der Bildangehörige, um beim Zeichnen von Kreisen mit ImageSelipse () einen Anti-Alias-Effekt zu erzielen?

Wie verwendet ich die Funktion der Bildangehörige, um beim Zeichnen von Kreisen mit ImageSelipse () einen Anti-Alias-Effekt zu erzielen?

M66 2025-06-23

Verstehen Sie vor Einführung der Implementierungsmethode zunächst zwei Schlüsselfunktionen:

  • ImageSellipse (Ressource $ Image, int $ cx, int $ cy, int $ width, int $ height, int $ color) : Zeichnen Sie eine Ellipse im Bild.

  • Imagesantialias (Ressource $ Image, Bool $ aktiviert) : Ein- oder Aus-Anti-Aliasing ein- oder ausschaltet.

Es ist jedoch zu beachten, dass ImageAntialias () nur für Grafiken funktioniert, die mit Funktionen wie ImageLine () , Imagsectangle () usw. gezogen wurden, und wirkt sich nicht auf ImageSellipse () aus. Dies ist eine Grube, die viele Entwickler zu übersehen können.

Wie kann man beim Zeichnen von Kreisen Anti-Aliasing erreichen?

Wir müssen eine Strategie ändern, eine höhere Auflösung verwenden, um die Grafiken zu zeichnen und das Bild zu verkleinern oder den Anti-Aliasing-Effekt manuell zu simulieren. Hier ist ein gemeinsamer Ansatz: Hochauflösende Zeichnung + Skalierung , was eine einfache Möglichkeit ist, Anti-Aliasing ohne die Hilfe einer zusätzlichen Grafikbibliothek zu erreichen.

Beispielcode

 <?php
// Stellen Sie das Skalieren von Mehrfachempfänger ein,Zum Beispiel3Zeichnen zuweilen Auflösung
$scale = 3;
$width = 200;
$height = 200;

$scaledWidth = $width * $scale;
$scaledHeight = $height * $scale;

// Erstellen Sie große Bildressourcen
$largeImage = imagecreatetruecolor($scaledWidth, $scaledHeight);
imageantialias($largeImage, true);

// Stellen Sie die Hintergrundfarbe auf Weiß ein und füllen Sie sie
$white = imagecolorallocate($largeImage, 255, 255, 255);
imagefill($largeImage, 0, 0, $white);

// Stellen Sie die Kreisfarbe ein
$circleColor = imagecolorallocate($largeImage, 0, 0, 255);

// Zeichnen Sie eine Ellipse(Eigentlich ist es ein Kreis)
$cx = $scaledWidth / 2;
$cy = $scaledHeight / 2;
$radius = min($scaledWidth, $scaledHeight) * 0.4;
imageellipse($largeImage, $cx, $cy, $radius * 2, $radius * 2, $circleColor);

// Erstellen Sie Ziel -kleine Bildressource
$finalImage = imagecreatetruecolor($width, $height);

// Verkleinern Sie das Bild zum Anti-Aliasing
imagecopyresampled($finalImage, $largeImage, 0, 0, 0, 0, $width, $height, $scaledWidth, $scaledHeight);

// Ausgabebild
header('Content-Type: image/png');
imagepng($finalImage);

// Reinigen Sie den Speicher
imagedestroy($largeImage);
imagedestroy($finalImage);
?>

Effekte und Anweisungen

In diesem Beispiel zeichnen wir zuerst einen größeren Kreis unter Verwendung der dreifachen Originalgröße und verwenden dann die Funktion "ImageCopyresampled (), um das Bild auf die Zielgröße zu reduzieren. Dieser Prozess ist gleichbedeutend mit der Simulation von Anti-Aliasing, und die Kanten des Ausgangsbildes erscheinen glatter.

Obwohl ImageAntialias () für ImageSellipse () nicht gültig ist, können wir diese Einschränkung durch die Skalierungsstrategie immer noch umgehen und Bilder von höherer Qualität erzeugen. Wenn Sie hohe Anforderungen an die Bildverarbeitung haben, ist es angemessener, eine professionelle Bildverarbeitungsbibliothek wie Imagemagick zu verwenden.

Verlängerungsvorschläge

Wenn Sie das Bild anstelle des Ausgangsbrowsers auf dem Server speichern möchten, können Sie die folgende Methode verwenden:

 imagepng($finalImage, '/path/to/save/image.png');

Oder generieren Sie einen Zugriffslink:

 $filename = 'https://m66.net/images/circle.png';
imagepng($finalImage, '/var/www/m66.net/images/circle.png');

Bitte stellen Sie sicher, dass der Pfad, der M66.net entspricht, Schreibberechtigungen hat.

Diese Skalierungsmethode eignet sich auch zum Zeichnen anderer Figuren wie Polygonen, freien Kurven usw. Es handelt sich um eine Anti-Aliasing-Technik, die üblicherweise in der GD-Bibliothek verwendet wird.