Comment vérifier si une image a la transparence à l'aide de GD?
Comment puis-je vérifier si une image a des pixels transparents avec php avec la librairie GD?
- Ce genre d'image? GIF, PNG-8 ou PNG-24?
Vous devez vous connecter pour publier un commentaire.
Il ne semble pas que vous pouvez détecter la transparence d'un coup d'oeil.
Les commentaires sur le
imagecolorat
de la page de manuel suggèrent que l'entier obtenu lorsque l'on travaille avec une vraie couleur de l'image peut effectivement être décalée de quatre fois au total, avec le quatrième étant le canal alpha (les trois autres étant le rouge, le vert et le bleu). Par conséquent, compte tenu de toute l'emplacement du pixel à$x
et$y
, vous pouvez détecter l'alpha à l'aide de:Un
$alpha
est de 127 apparemment complètement transparent, tandis que le zéro est complètement opaque.Malheureusement, vous pourriez avoir besoin pour traiter de chaque pixel dans l'image juste d'en trouver un qui soit transparent, et puis cela ne fonctionne qu'avec des images en couleur. Sinon
imagecolorat
retourne un index de couleur, que vous devez alors rechercher à l'aide deimagecolorsforindex
, qui renvoie en fait un tableau avec une valeur alpha.getImageAlphaChannel
méthode semble comme il pourrait le faire. L'extension Imagick est non-standard, et je ne suis pas sûr si cela peut être fait avec un bon vieux vanille appelé par exec Image Magick.Je sais que c'est vieux, mais je viens de trouver cela sur les commentaires de l'PHP docs. (lien)
Ne fonctionne que pour les images PNG si.
is_alpha_png
fonction, et faire seulement profondément à la recherche du pixel transparent si c'est vrai3
. Je serai à l'aide de @Anubis répondre à la place qu'il va vérifier pourPLTE
ettRNS
ainsi que par libpng.org/pub/png/book/chapter08.html#png.ch08.div.5.2Il peut être fait!
J'ai réuni toutes les réponses et les commentaires dans une fonction qui devrait être rapide & fiable:
Je sais que c'est un vieux thread, mais à mon avis il doit s'améliorer depuis la marche grâce à une énorme png par la vérification de tous les pixels seulement pour découvrir qu'il n'est pas transparent est une perte de temps. Après quelques googleing j'ai trouvé Jon Fox Blog et j'ai amélioré son code à l'aide de la W3C Spécification PNG plus d'être fiable, rapide et avoir un minimum sur l'empreinte mémoire:
PLTE
ou l'un des autres mots clés serait couvrant deux blocs de 1024 octets? Alors votre script serait un échec... Sinon, cela semble être la accepté de répondre.Assez détroit de fonction de transfert, il vérifie si il n'y a aucune transparence du pixel dans l'image, si elle l'est, elle retournera true.
C'est de cette façon que je détecte 8-32 bits de transparence. - Il seulement avec la PNG.
cronoklee de la fonction est très bon, mais quand je l'utilise j'ai trouvé un bug. Il ne fonctionne pas pour les images 8 bits palette. Ici est la partie fixe de la variante:
Amélioration de la cronoklee de la fonction. Retiré inutile décalage de bits pour chaque pixel, de réduire les faux négatifs comte, a ajouté l'explication dans la description de fonction.
Utilisation: