"This was stored as 8bit where 0 is completely transparant, and 255 is complete opaque."
This would be a lot more efficient:
<?php
$alpha7 = ((~((int)$alpha8)) & 0xff) >> 1;
?>
where alpha8==255, alpha7==0
where alpha8=127, alpha7== 64
where alpha8==0, alpha7==127
imagecolorallocatealpha
(PHP 4 >= 4.3.2, PHP 5)
imagecolorallocatealpha — Alloue une couleur à une image
Description
$image
, int $red
, int $green
, int $blue
, int $alpha
)
imagecolorallocatealpha() se comporte comme
imagecolorallocate() avec en plus le paramètre de
transparence alpha.
Liste de paramètres
-
image -
Une ressource d'image, retournée par une des fonctions de création d'images, comme imagecreatetruecolor().
-
red -
Valeur du composant rouge.
-
green -
Valeur du composant vert.
-
blue -
Valeur du composant bleu.
-
alpha -
Une valeur entre 0 et 127. 0 indique une opacité complète tandis que 127 indique une transparence complète.
Valeurs de retour
Un identifiant de couleur ou FALSE si l'allocation échoue.
Cette fonction peut
retourner FALSE, mais elle peut aussi retourner une valeur équivalent à
FALSE. Veuillez lire la section sur
les booléens pour plus d'informations.
Utilisez l'opérateur ===
pour tester la valeur de retour exacte de cette fonction.
Historique
| Version | Description |
|---|---|
| 5.1.3 |
Retourne FALSE si l'allocation échoue. Précédemment,
-1 était retourné.
|
Exemples
Exemple #1 Exemple avec imagecolorallocatealpha()
<?php
$size = 300;
$image=imagecreatetruecolor($size, $size);
// quelque chose pour obtenir un fond blanc avec une bordure noire
$back = imagecolorallocate($image, 255, 255, 255);
$border = imagecolorallocate($image, 0, 0, 0);
imagefilledrectangle($image, 0, 0, $size - 1, $size - 1, $back);
imagerectangle($image, 0, 0, $size - 1, $size - 1, $border);
$yellow_x = 100;
$yellow_y = 75;
$red_x = 120;
$red_y = 165;
$blue_x = 187;
$blue_y = 125;
$radius = 150;
// alloue des couleurs avec des valeurs alpha
$yellow = imagecolorallocatealpha($image, 255, 255, 0, 75);
$red = imagecolorallocatealpha($image, 255, 0, 0, 75);
$blue = imagecolorallocatealpha($image, 0, 0, 255, 75);
// Dessine 3 ellipses
imagefilledellipse($image, $yellow_x, $yellow_y, $radius, $radius, $yellow);
imagefilledellipse($image, $red_x, $red_y, $radius, $radius, $red);
imagefilledellipse($image, $blue_x, $blue_y, $radius, $radius, $blue);
// Ne pas oublier d'envoyer un header correct
header('Content-Type: image/png');
// et finallement, afficher le résultat
imagepng($image);
imagedestroy($image);
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
Notes
Note: Cette fonction requiert la bibliothèque GD 2.0.1 ou supérieure (2.0.28 ou supérieure est recommandée).
Voir aussi
- imagecolorallocate() - Alloue une couleur pour une image
- imagecolordeallocate() - Supprime une couleur d'une image
I have had a case where I got the alpha from a raw RGBA pallete. This was stored as 8bit where 0 is completely transparant, and 255 is complete opaque.
This is impossible to use with imagecolorallocatealpha() as it requires a 7bit int where 0 is completely opaque and 127 is completely transparant (otherway around)
You can solve this by subtracting 255, removing the negative sign (either by converting to string and substr($alpha, 1) or some other way) and then bitshifting the answer to the right by one 1 bit.
Example:
<?php
$alpha = 0; // equivalent to alpha 127 needed for imagecolorallocatealpha()
$alpha = $alpha - 255; // subtract 255, this will give a negative number
$alpha = substr($alpha, 1); // remove negative/minus sign
$alpha = (int)$alpha; // convert back to integer
$alpha = $alpha >> 1; // bitshift to the right once.
echo $alpha; // output: 127
// This can be done in one line of course:
$alpha = 255; // equivalent to 0 for imagecolorallocatealpha()
$alpha = ((int)(substr($alpha - 255, 1))) >> 1;
echo $alpha; // outputs 0
?>
If you need to calculate the integer representation of a color with an alpha channel, without initialising an image and using the imagecolorallocatealpha function. Then this function might be of some help:
<?php
function alphaColor($hexColor,$alpha)
{
return bindec(decbin($alpha).decbin(hexdec($hexColor));
}
echo alphaColor("FFFFFF",127);
?>
If you only wish to extract the alpha value for a color, you can simply extract it like so:
<?php
$color = imagecolorat($im, 50, 50);
$alpha = $color >> 24;
?>
It actually shifts off the first 24 bits (where 8x3 are used for each color), and returns the remaining 7 allocated bits (commonly used for alpha)
Check out this Source, it's a little funny feature showing you, for what imagecolorallocatealpha() is used:
<?php
$im=imagecreatetruecolor(300,300);
$white=imagecolorallocate($im,255,255,255);
imagefilledrectangle($im,0,0,imagesx($im),imagesy($im),$white);
for($i=0;$i<256;$i=$i+10)
{
$col=imagecolorallocatealpha($im,$i,$i,$i,ceil(rand(0,127)));
imagefilledellipse($im,$i,$i,$i,$i,$col);
}
header("content-type: image/png");
imagepng($im);
?>
