Lors de l'utilisation de la bibliothèque de traitement d'image GD de PHP, la fonction ImageeANtialias () est souvent utilisée pour lisser les bords de l'image, en particulier le dessin des lignes, du texte et des graphiques. Cependant, de nombreux développeurs constateront que ImageeANtialias () ne produit aucun effet évident lors du traitement des images PNG-format. Pourquoi cela se produit-il? Cet article vous emmènera pour comprendre les raisons derrière.
La fonction Imageantalias () est utilisée pour activer ou désactiver l'image antialiasing. La syntaxe de base est la suivante:
imageantialias($image, true);
Lorsqu'il est défini sur true , la bibliothèque GD essaie d'utiliser des algorithmes anti-aliasing pour lisser les bords des graphiques lors du dessin d'images, améliorant ainsi l'effet visuel. Mais il convient de noter que cet effet anti-aliasing se reflète principalement dans l'opération de dessin , et non par l'image elle-même.
C'est-à-dire qu'il ne prend effet que sur les éléments dessinés via GD (tels que Imageline () , ImagePolygon () , etc.) et n'a aucun impact direct sur le contenu de l'image chargé.
Imageantalias () n'est valable que pour les ressources d'image créées à l'aide d' imageRereAtRuEColor () . Si l'image de palette créée à l'aide d'imageCreate () est basée sur une palette, la fonction anti-aliasing ne prendra pas effet. Les images PNG sont généralement enregistrées au format de couleur True, mais lorsqu'ils sont chargés via ImageCreateFrommpng () , il peut être chargé sous forme de palette (selon le mode couleur de l'image elle-même).
La solution est la suivante:
$image = imagecreatefrompng("https://m66.net/images/sample.png");
$trueColor = imagecreatetruecolor(imagesx($image), imagesy($image));
imagecopy($trueColor, $image, 0, 0, 0, 0, imagesx($image), imagesy($image));
imageantialias($trueColor, true);
C'est un point clé que de nombreux développeurs ignorent: Imageanttialias () n'a aucun effet sur les "déjà pixels" des ressources d'image. C'est-à-dire que si vous chargez une image PNG existante, l'appel ImageeAralias () ne post-trait pas directement l'image. Ce n'est pas un "filtre d'image", mais un commutateur d'optimisation de dessin.
Si vous souhaitez brouiller ou lisser toute l'image PNG, vous devez utiliser une fonction telle que ImageFilter () . Exemple:
$image = imagecreatefrompng("https://m66.net/images/sample.png");
imagefilter($image, IMG_FILTER_SMOOTH, 10);
La PNG prend en charge les canaux alpha (transparence), et ImageeANtiAnias () ne gère pas directement le mélange des bords de pixels transparents. Lorsque vous dessinez du contenu sur des images transparentes, il peut toujours y avoir un "déchiqueté" sur les bords. Pour le moment, vous pouvez utiliser des couleurs translucides pour dessiner, puis combiner le mélange de calques pour obtenir de meilleures transitions de bord.
Exemple:
$color = imagecolorallocatealpha($image, 255, 0, 0, 50); // Rouge translucide
imagefilledellipse($image, 100, 100, 50, 50, $color);
Utilisez toujours des ressources d'image TrueColor.
Activer l'anti-aliasing uniquement pour les opérations de dessin.
Ne vous attendez pas à ce que cela fonctionne sur les images existantes.
Combiné avec ImageFilter () pour obtenir une optimisation d'image plus avancée.
Si vous avez déjà trouvé ImageeANTIALIAS () n'a aucun effet lorsque vous travaillez avec des images PNG, c'est très probablement parce que vous avez mal compris à quoi il sert. Ce n'est pas un filtre pour l'affûtage ou le lissage d'images, mais un commutateur qui n'affecte que le "dessin graphique". Après avoir compris comment cela fonctionne, vous pouvez combiner d'autres fonctions GD pour réaliser l'effet d'optimisation de l'image que vous voulez vraiment.