2016-12-11 1 views
2

J'essaye de supprimer le canal alpha (transparence) d'un fichier PNG et de le remplacer par un fond blanc en PHP.PHP: Convertir un canal alpha en fond blanc avec ImageMagick

Utilisation de ImageMagick Jusqu'à présent, j'ai essayé plusieurs fonctions sans succès. Ce sont la fonction qui ne fonctionne pas:

$iMagick->setImageAlphaChannel(Imagick::ALPHACHANNEL_DEACTIVATE); 
    $iMagick->setImageBackgroundColor('#FFFFFF'); 
    $iMagick = $iMagick->mergeImageLayers(Imagick::LAYERMETHOD_FLATTEN); 

également setBackgroundColor('#FFFFFF') au lieu de setImageBackgroundColor('#FFFFFF') n'a pas aidé. Idem pour remplacer '#FFFFFF' par 'white' dans ces 2 fonctions.

Utilisation d'ImageMagick 3.4.0RC6 (date de publication: 2016-11-29) compilée avec ImageMagick 6.8.9-9 Q16 x86_64 2016-03-14. Versions actuelles (Ubuntu 16.04).

Des idées? Merci d'avance
ninsky

Répondre

1

omettez simplement votre première ligne de code qui désactive la transparence et de courir avec:

$iMagick->setImageBackgroundColor('#FFFFFF'); 
$iMagick = $iMagick->mergeImageLayers(Imagick::LAYERMETHOD_FLATTEN); 
+0

J'ai essayé ça et testé avec l'identifiant d'Imagick -verbose. Got: "Profondeur du canal: rouge: 8 bits, vert: 8 bits, bleu: 8 bits, alpha: 1 bit, couleur transparente: aucune". Donc je pense que cela a fait l'affaire. Merci! – ninsky

+0

Pouvez-vous expliquer comment cela fonctionne? – peter

+1

@peter Imaginez une pile d'images, chacune avec des bits transparents (zones transparentes). Tout d'abord, placez une feuille blanche sur votre bureau, c'est-à-dire 'BackgroundColor (white)', puis déposez toutes les autres images avec des zones transparentes sur le dessus. L'effet net est que vous verrez blanc ils sont tous transparents. –

1

Voici une fonction que j'utilise. Ce n'est pas basé sur ImageMagick, cependant. Il l'a pris à partir d'une autre réponse stackoverflow et l'a personnalisé pour coloriser uniquement les pixels transparents.

function colorizeTransparent($file, $targetR, $targetG, $targetB, $targetName) { 

     $im_src = imagecreatefrompng($file); 
     $width = imagesx($im_src); 
     $height = imagesy($im_src); 
     $im_dst = imagecreatefrompng($file); 

     for($x=0; $x<$width; $x++) { 
      for($y=0; $y<$height; $y++) { 
       $rgba = imagecolorat($im_src, $x, $y); 
       $alpha = ($rgba & 0x7F000000) >> 24; 
       if ($rgba == 0) { 
        $col = imagecolorallocatealpha($im_dst, 
         $targetR - (int) (1.0/255.0 * $alpha * (double) $targetR), 
         $targetG - (int) (1.0/255.0 * $alpha * (double) $targetG), 
         $targetB - (int) (1.0/255.0 * $alpha * (double) $targetB), 
         $alpha 
        ); 
       } else $col = $rgba; 
       imagesetpixel($im_dst, $x, $y, $col); 
      } 
     } 
     imagepng($im_dst, $targetName); 
    } 

Appelez la fonction de cette façon:

colorizeTransparent($sourceImage, 0xFF, 0xFF, 0xFF, $colorizedImage); 

Avec $ sourceImage étant le nom du fichier source et $ colorizedImage étant le nom du fichier de destination.

Faites-moi savoir comment cela a fonctionné pour vous.

+0

Merci. Je ne l'ai pas testé car je veux coller aux fonctions d'Imagick. Merci quand même. – ninsky