Maison >développement back-end >tutoriel php >Comment redimensionner correctement les PNG avec transparence en PHP ?

Comment redimensionner correctement les PNG avec transparence en PHP ?

Susan Sarandon
Susan Sarandonoriginal
2024-11-25 05:03:15415parcourir

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);

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);

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);

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!

Déclaration:
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