J'aime votre script, bonne idée de supprimer les informations de couleur supplémentaire lorsque le pixel est totalement transparent. Je précise juste une petite erreur (OMI) mais si quelqu'un veut utiliser cette méthode.
$color = imagecolorsforindex( $source, imagecolorat( $source, $x, $y ) );
devrait être
$color = imagecolorsforindex( $picture, imagecolorat( $picture, $x, $y ) );
aussi je ne suis pas 100% sûr de savoir pourquoi vous êtes la vérification des valeurs rvb ici si le pixel est 100% transparent
if(($alpha['red'] == 0) && ($alpha['green'] == 0) && ($alpha['blue'] == 0) && ($alpha['alpha'] == 0))
...
et je ne suis pas sûr que le mélange alpha à partir du fichier de masque serait bien travailler avec votre méthode, comme son utilisé uniquement lors de la rgba des valeurs égales à 0.
Jules du script est très bonne aussi, bien qu'il s'attend à ce que le masque à une échelle de gris de la représentation d'un masque (ce qui est assez courant).
Dans Matt requête qu'il était, après un script qui attrape juste la transparence alpha d'une image existante et l'applique à une autre image. Voici un simple mod de Jules script juste pour attirer l'alpha de l'image du masque, et de préserver la couche alpha de l'image source.
<?php
// Load source and mask
$source = imagecreatefrompng( '1.png' );
$mask = imagecreatefrompng( '2.png' );
// Apply mask to source
imagealphamask( $source, $mask );
// Output
header( "Content-type: image/png");
imagepng( $source );
function imagealphamask( &$picture, $mask ) {
// Get sizes and set up new picture
$xSize = imagesx( $picture );
$ySize = imagesy( $picture );
$newPicture = imagecreatetruecolor( $xSize, $ySize );
imagesavealpha( $newPicture, true );
imagefill( $newPicture, 0, 0, imagecolorallocatealpha( $newPicture, 0, 0, 0, 127 ) );
// Resize mask if necessary
if( $xSize != imagesx( $mask ) || $ySize != imagesy( $mask ) ) {
$tempPic = imagecreatetruecolor( $xSize, $ySize );
imagecopyresampled( $tempPic, $mask, 0, 0, 0, 0, $xSize, $ySize, imagesx( $mask ), imagesy( $mask ) );
imagedestroy( $mask );
$mask = $tempPic;
}
// Perform pixel-based alpha map application
for( $x = 0; $x < $xSize; $x++ ) {
for( $y = 0; $y < $ySize; $y++ ) {
$alpha = imagecolorsforindex( $mask, imagecolorat( $mask, $x, $y ) );
//small mod to extract alpha, if using a black(transparent) and white
//mask file instead change the following line back to Jules's original:
//$alpha = 127 - floor($alpha['red'] / 2);
//or a white(transparent) and black mask file:
//$alpha = floor($alpha['red'] / 2);
$alpha = $alpha['alpha'];
$color = imagecolorsforindex( $picture, imagecolorat( $picture, $x, $y ) );
//preserve alpha by comparing the two values
if ($color['alpha'] > $alpha)
$alpha = $color['alpha'];
//kill data for fully transparent pixels
if ($alpha == 127) {
$color['red'] = 0;
$color['blue'] = 0;
$color['green'] = 0;
}
imagesetpixel( $newPicture, $x, $y, imagecolorallocatealpha( $newPicture, $color[ 'red' ], $color[ 'green' ], $color[ 'blue' ], $alpha ) );
}
}
// Copy back to original picture
imagedestroy( $picture );
$picture = $newPicture;
}
?>