2009-06-22 8 views
3

J'utilise GD pour redimensionner et convertir des images, mais lors de mes tests, j'ai trouvé un comportement étrange lors de la conversion de PNG transparents en JPEG. Selon le manuel ImageAlphaBlending() est activé par défaut, mais afin de préserver la transparence, je dois définir ImageSaveAlpha() sur true (ce qui nécessite à mon tour de définir ImageAlphaBlending() sur false). Ainsi, la manière correcte devrait être:PHP/GD ImageSaveAlpha et ImageAlphaBlending

$result = ImageCreateFromPNG(...); 
ImageAlphaBlending($result, false); 
ImageSaveAlpha($result, true); 
ImageFill($result, 0, 0, IMG_COLOR_TRANSPARENT); 
ImageJPEG($result); 
ImageDestroy($result); 

Cependant, si je le fais de la « bonne » toute la zone de transparence vient en noir au format JPEG. Cela semble fonctionner (JPEG avec un fond blanc sur des zones transparentes) sur mes tests:

$result = ImageCreateFromPNG(...); 
ImageAlphaBlending($result, true); // true by default, but still... 
ImageSaveAlpha($result, true); 
ImageFill($result, 0, 0, IMG_COLOR_TRANSPARENT); 
ImageJPEG($result); 
ImageDestroy($result); 

Quelqu'un peut-il me éclairer sur s'il vous plaît ce sujet?

+0

Désolé! Les images Afaik au format JPEG ne peuvent pas avoir d'arrière-plan "transparent" ou de canal alpha. – merkuro

+0

Ouais, je le sais. Je veux juste que toute la zone transparente de l'image PNG d'origine soit convertie en blanc sur la sortie JPEG. Désolé si je ne me suis pas bien expliqué. –

Répondre

6

Cela dépend probablement de votre PNG. Un fichier PNG peut contenir une couleur d'arrière-plan, qui peut être utilisée lorsque la transparence ne fonctionne pas. Votre PNG a probablement un fond blanc. Lorsque vous définissez imageaplhablending sur true, la couleur d'arrière-plan de votre fichier PNG est prise en compte lors de l'écriture du fichier JPEG. Lorsque vous le définissez sur false, il sélectionne la valeur par défaut pour GD qui est noir.

Vous pouvez l'essayer par vous-même. Créez un fichier PNG transparent et enregistrez-le avec une couleur d'arrière-plan orange ou rose. Votre deuxième exemple devrait montrer cette couleur. A propos, l'astuce de couleur d'arrière-plan PNG est une bonne chose pour les images IE6. IE6 ne prend pas en charge les fichiers PNG transparents, il les affichera avec la couleur d'arrière-plan avec laquelle vous les avez enregistrés. Lorsque vous enregistrez des fichiers PNG transparents, enregistrez-les avec la même couleur d'arrière-plan que votre site Web. Il semblera mieux que les boîtes blanches ou noires autour de vos images PNG dans IE6.

3

Si vous convertissez de PNG (ou GIF) en JPG, vous devriez probablement copier l'image finale à une autre image qui est rempli de blanc, utilise imagecopy ($image est une image déjà créée avec GD):

// Create a new background 
$bg = imagecreatetruecolor(imagesx($image), imagesy($image)); 

// Allocate the color 
$color = imagecolorallocate($bg, 255, 255, 255); 

// Fill the background with white 
imagefill($bg, 0, 0, $color); 

// Alpha blending must be enabled on the background! 
imagealphablending($bg, TRUE); 

// Copy the current image onto the opaque background 
if (imagecopy($bg, $image, 0, 0, 0, 0, imagesx($image), imagesy($image))) 
{ 
    // Replace the image with the background copy 
    imagedestroy($image); 
    $image = $bg; 
} 

Espérons que cela aide.

+0

Commentant l'imagealphablending ($ bg, TRUE); line me donne exactement le même résultat, néanmoins c'est à peu près ce que je fais avec la constante IMG_COLOR_TRANSPARENT. Mon principal doute ici est l'utilisation simultanée d'ImageAlphaBlending et ImageSaveAlpha, tous les deux mis à vrai. C'est la seule façon d'obtenir des résultats corrects mais le manuel dit que c'est faux et que les deux ne peuvent pas être vrais en même temps. –

+0

Je ne sais pas exactement ce que fait votre code, mais le code ci-dessus a fonctionné pour moi. – shadowhand