Comment redimensionner correctement les PNG avec transparence en PHP ?

Susan Sarandon
Libérer: 2024-11-25 05:03:15
original
337 Les gens l'ont consulté

How to Properly Resize PNGs with Transparency in PHP?

Redimensionner des PNG avec transparence en PHP : une solution complète

En PHP, redimensionner des images PNG avec un arrière-plan transparent peut être un défi. Pour résoudre ce problème, un exemple de code qui s'est avéré inefficace nécessite quelques modifications cruciales pour obtenir le résultat souhaité. Voici une explication détaillée de ce qui doit être ajusté :

Le code fourni :

$this->image = imagecreatefrompng($filename);

imagesavealpha($this->image, true);
$newImage = imagecreatetruecolor($width, $height);

// Make a new transparent image and turn off alpha blending to keep the alpha channel
$background = imagecolorallocatealpha($newImage, 255, 255, 255, 127);
imagecolortransparent($newImage, $background);
imagealphablending($newImage, false);
imagesavealpha($newImage, true);

imagecopyresampled($newImage, $this->image, 0, 0, 0, 0, $width, $height,  $this->getWidth(), $this->getHeight());
$this->image = $newImage;  
imagepng($this->image,$filename);
Copier après la connexion

Après avoir soigneusement examiné ce code, il est devenu évident que le problème réside dans l'instruction où imagecolorallocatealpha() est appelé. Le bon ordre des opérations est essentiel ici : vous devez d'abord définir le mode de fusion sur false et l'indicateur de canal alpha de sauvegarde sur true avant d'exécuter imagecolorallocatealpha().

imagesavealpha($newImg, true);
imagealphablending($newImg, false);
Copier après la connexion

Après avoir effectué cela modification, votre code devrait pouvoir redimensionner avec succès les images PNG avec un arrière-plan transparent, empêchant l'arrière-plan de devenir noir.

Mise à jour pour les images avec une opacité comprise entre 0 et 100 :

Le code fourni ne fonctionne que pour les images dont l'opacité est définie sur 0. Si votre image a une opacité comprise entre 0 et 100, l'arrière-plan apparaîtra noir. Pour résoudre ce problème, vous devrez ajuster la fonction imagecopyresampled() pour utiliser imagecopyresampled() à la place, car elle gère mieux les images PNG transparentes avec différents niveaux d'opacité.

$transparent = imagecolorallocatealpha($newImg, 255, 255, 255, 127);
imagefilledrectangle($newImg, 0, 0, $newWidth, $newHeight, $transparent);
imagecopyresampled($newImg, $image, 0, 0, 0, 0, $newWidth, $newHeight, $src_w, $src_h);
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal