2011-09-01 3 views
1

Je suis en train de cadrer des annonces avec une bordure incurvée.Fusion de plusieurs fichiers PNG transparents en un seul

Voici une exemple d'annonce: http://imageshack.us/f/20/4e5f5fe94b327new60seciq.png/

Je suis en train de reproduire ce qui se fait dans Photoshop, placez l'un sur l'autre. Voici le code que je utilise:

// create destination canvas 
$dest_img = imagecreatetruecolor(176, 75); 

// Make the background transparent 
$black = imagecolorallocate($dest_img, 0, 0, 0); 
imagecolortransparent($dest_img, $black); 

imageAlphaBlending($dest_img, false); 
imageSaveAlpha($dest_img, true); 

// copy ad into destination 
imagecopy($dest_img, $ad_image, 0, 0, 0, 0, 176, 75); 

// copy frame onto first half of image 
imagecopy($dest_img, $curve_image, 0, 0, 0, 0, 88, 75); 

Ce qui se passe est que la dernière copie ait lieu (le cadre) est prioritaire par et au lieu de voir l'annonce, im obtenir un bloc transparent. Voici une sauter image de ce que GD est en train de faire:

http://imageshack.us/f/684/unled1to.png/

J'espère qu'il ya une solution simple pour obtenir la couche inférieure de rester visible - sinon je pense que je vais devoir écrire une fonction et allez pixel par pixel et comparez ...

if (bottom_px == trans && top_px == trans) { 
    dest_px = trans; 
} 
else { 
    dest_px = top_px; 
} 
+0

Mon représentant est faible alors voici le lien vers l'image du cadre: http://imageshack.us/f/405/singlew.png/ – cloakedninjas

Répondre

0

Définissez imagealphablending sur true. De l'emploi, d'italique:

Dans le mode de mélange, le composant de canal alpha de la couleur fournie à toutes les fonctions de dessin, telles que imagesetpixel() détermine la quantité de la couleur sous-jacent devrait être autorisé à briller à travers. Par conséquent, gd fusionne automatiquement la couleur existante à ce point avec la couleur du dessin et stocke le résultat dans l'image. Le pixel résultant est opaque. En mode non-fusionné, la couleur de dessin est copiée littéralement avec ses informations de canal alpha, en remplaçant le pixel de destination. Le mode de fusion n'est pas disponible lorsque vous dessinez sur des images de palette.

De plus, vous ne colorez pas réellement l'arrière-plan transparent. Vous dites simplement que $black est transparent. Au lieu de cela, utilisez imagefill avec imagecolorallocatealpha:

imagefill($dest_img, 0, 0, imagecolorallocatealpha($dest_img, 0, 0, 0, 127)); 
+0

Merci pour corrige replying.That le trou béant - cependant les coins ne sont plus transparents. Les coins sont noirs – cloakedninjas

+0

Exemple: http://imageshack.us/f/696/unled1ub.png/ – cloakedninjas

+0

Voir ma mise à jour. –

Questions connexes