2012-09-04 23 views
6

Estoy intentando crear una función para cambiar el tamaño de las imágenes PNG transparentes y agregarles una marca de agua PNG transparente. He intentado colocar imagealphablending ($ image_p, false); y imagesavealpha ($ image_p, true); en todas partes, pero hace fondo negro o recorta la primera imagen. Aquí está mi código:Combina dos imágenes transparentes PNG

$newName=$this->filename; 
list($OrigWidth, $OrigHeight)=$this->info; 
if($OrigHeight>$OrigWidth){ 
    $pomer=$OrigWidth/$OrigHeight; 
    $NewHeight=$h; 
    $NewWidth=$NewHeight*$pomer; 
}else{ 
    $pomer=$OrigHeight/$OrigWidth; 
    $NewWidth=$w; 
    $NewHeight=$NewWidth*$pomer; 
} 

$image_p=imagecreatetruecolor($NewWidth, $NewHeight); 
if($this->ext=="jpg") 
$image=imagecreatefromjpeg($newName); 
elseif($this->ext=="png") 
$image=imagecreatefrompng($newName); 
elseif($this->ext=="gif") 
$image=imagecreatefromgif($newName); 

if($this->ext=="png" or $this->ext=="gif"){ //průhlednost 
    imagealphablending($image_p, false); 
    imagesavealpha($image_p,true); 
    $transparent = imagecolorallocatealpha($image_p, 255, 255, 255, 127); 
    imagefilledrectangle($image_p, 0, 0, $NewWidth, $NewHeight, $transparent); 
} 

if(($OrigWidth>$w or $OrigHeight>$h) and $w!=0) 
    imagecopyresampled($image_p, $image, 0, 0, 0, 0, $NewWidth, $NewHeight, $OrigWidth, $OrigHeight); 
else 
    $image_p=$image; //není třeba zmenšovat 

if($vodoznak!=""){ //if watermark is set 
    //imagealphablending($image_p, false); 
    //imagesavealpha($image_p,true); 
    $watermark = imagecreatefrompng($vodoznak);  
    $ww = imagesx($watermark); 
    $wh = imagesy($watermark); 
    if($umisteni{0}=="0") $x=3; else $x=$OrigWidth-$ww-3;  
    if($umisteni{1}=="0") $y=3; else $y=$OrigHeight-$wh-3; 
    imagealphablending($watermark, false); 
    imagesavealpha($watermark,true); 
    imagecopy($image_p, $watermark, $x, $y, 0, 0, $ww, $wh); 
} 

if($this->ext=="jpg") 
imagejpeg($image_p, $copypath, $komprese); 
elseif($this->ext=="png") 
imagepng($image_p, $copypath); 
elseif($this->ext=="gif") 
imagegif($image_p, $copypath); 

No sé donde he de colocar la configuración alfa, por favor ayuda. ¡Gracias por cada consejo!

+2

Honestamente, debe ser ImageMagick para esto. – wesside

+0

ImageMagick no está instalado en mi alojamiento web. – deader

+1

@wes ¿Por qué ImageMagick? He hecho algo así antes, usando funciones simples de GD. –

Respuesta

3

La función imagesavealpha necesita ser aplicada a la imagen que está pegando en la que creó, por lo que en lugar de $image$image_p:

imagealphablending($image, true); 
imagesavealpha($image,true); 

Al igual que lo hizo con la marca de agua!

+0

¡Eso es todo! Lo agregué antes de imagepng() y funciona. ¡Gracias! – deader

Cuestiones relacionadas