2010-12-14 15 views
9

Tengo una imagen (llamémosla imagen original) en la que quiero filtrar otra imagen (vamos a llamarlo logo).
El logotipo es un PNG transparente, mientras que la imagen original puede ser png, jpg o gif.
Tengo el siguiente código:Usando GD en PHP, ¿cómo puedo hacer una marca de agua PNG transparente en los archivos PNG y GIF? (Los archivos JPG funcionan bien)

function watermarkImage($originalFileContents, $originalWidth, $originalHeight) { 
    $logoImage = imagecreatefrompng('logo.png'); 
    imagealphablending($logoImage, true); 

    $logoWidth = imagesx($logoImage); 
    $logoHeight = imagesy($logoImage); 

    $originalImage = imagecreatefromstring($originalFileContents); 

    $destX = $originalWidth - $logoWidth; 
    $destY = $originalHeight - $logoHeight; 

    imagecopy(
     // source 
     $originalImage, 
     // destination 
     $logoImage, 
     // destination x and y 
     $destX, $destY, 
     // source x and y 
     0, 0, 
     // width and height of the area of the source to copy 
     $logoWidth, $logoHeight 
    ); 
    imagepng($originalImage); 
} 

Este código funciona bien (bueno = mantener la transparencia del logotipo ) sólo cuando la imagen original es un archivo JPG.
Cuando el archivo original es un GIF o PNG, el logotipo tiene un fondo blanco sólido, lo que significa que la transparencia no funciona.

¿Por qué? ¿Qué necesito cambiar para que funcione?
Gracias

ACTUALIZACIÓN:
Aquí está mi versión recodificada:

function generate_watermarked_image($originalFileContents, $originalWidth, $originalHeight, $paddingFromBottomRight = 0) { 
    $watermarkFileLocation = 'watermark.png'; 
    $watermarkImage = imagecreatefrompng($watermarkFileLocation); 
    $watermarkWidth = imagesx($watermarkImage); 
    $watermarkHeight = imagesy($watermarkImage); 

    $originalImage = imagecreatefromstring($originalFileContents); 

    $destX = $originalWidth - $watermarkWidth - $paddingFromBottomRight; 
    $destY = $originalHeight - $watermarkHeight - $paddingFromBottomRight; 

    // creating a cut resource 
    $cut = imagecreatetruecolor($watermarkWidth, $watermarkHeight); 

    // copying that section of the background to the cut 
    imagecopy($cut, $originalImage, 0, 0, $destX, $destY, $watermarkWidth, $watermarkHeight); 

    // placing the watermark now 
    imagecopy($cut, $watermarkImage, 0, 0, 0, 0, $watermarkWidth, $watermarkHeight); 

    // merging both of the images 
    imagecopymerge($originalImage, $cut, $destX, $destY, 0, 0, $watermarkWidth, $watermarkHeight, 100); 
} 
+0

Esto puede ser de ayuda [PHP + GD: imagecopymerge no retener PNG transparencias] (http://stackoverflow.com/questions/3355993/phpgd-imagecopymerge-not-retaining-png-transparencies/3356419#3356419). – Mike

+0

@doron Gracias por el código de ejemplo. – vee

Respuesta

6

imagecopy no admite el uso de dos imágenes con canales alfa. eche un vistazo a imagecopymerge.

http://php.net/manual/en/function.imagecopymerge.php

hay ejemplos abundancia en el Comentario del usuario secciones, y una aplicación acabada de lo que quiere:

http://www.php.net/manual/en/function.imagecopymerge.php#92787

+0

La implementación final a la que se vinculó hizo el truco. Está mal escrito, pero después de grabarlo funcionó maravillosamente con unas 5 líneas de código. Gracias – Doron

+0

@Doron ¿puedes publicar tu versión recodificada? Sería una buena adición a mi libro de cocina personal;) ​​ –

+0

@ Oliver-a Claro, edité mi pregunta original y le agregué el código. – Doron

Cuestiones relacionadas