2010-03-16 18 views
2

J'utilise le script de tatouage PHP zubrags (ci-joint) et il fonctionne très bien sauf quand j'essaie d'utiliser un PNG-24 comme filigrane. L'image résultante a un filigrane tronqué et non transparent. Je me demande si quelqu'un pourrait aider à expliquer ce que je devrais modifier dans le script ci-dessous afin qu'un PNG-24 s'imprime comme un filigrane sur l'image? Je suis tombé sur cet article: http://www.benholmen.com/blog/2008/12/adding-png-watermarks-to-jpegs-with-php/ qui mentionnait l'utilisation de la fonction imagealphablending() de PHP pour le support de PNG-24.PHP Watermarking - Zubrag

Merci d'avance pour toute aide. Il est très apprécié :)

Filigrane de Zubrag:

class Zubrag_watermark { 

    var $offset_x = 0; 
    var $offset_y = 0; 
    var $quality = 100; 
    var $image_type = -1; // Image type: 1 = GIF, 2 = JPG, 3 = PNG 
    var $force_image_type = -1; // Change image type? (-1 = same as original, 1 = GIF, 2 = JPG, 3 = PNG) 
    var $save_to_file = true; 

    function Zubrag_watermark($image_path='', $offset_x=0, $offset_y=0) { 
    $this->setImagePath($image_path); 
    $this->setOffset($offset_x, $offset_y); 
    } 

    function setImagePath($image_path) { 
    $this->image_path = $image_path; 
    } 

    function setOffset($x, $y) { 
    $this->offset_x = $x; 
    $this->offset_y = $y; 
    } 

    function ImageCreateFromType($type,$filename) { 
    $im = null; 
    switch ($type) { 
    case 1: 
     $im = ImageCreateFromGif($filename); 
     break; 
    case 2: 
     $im = ImageCreateFromJpeg($filename); 
     break; 
    case 3: 
     $im = ImageCreateFromPNG($filename); 
     break; 
    } 
    return $im; 
    } 

    function ApplyWatermark($watermark_path) { 

    $this->watermark_path = $watermark_path; 

    // Determine image size and type 
    $size = getimagesize($this->image_path); 
    $size_x = $size[0]; 
    $size_y = $size[1]; 
    $image_type = $size[2]; // 1 = GIF, 2 = JPG, 3 = PNG 

    // load source image 
    $image = $this->ImageCreateFromType($image_type, $this->image_path); 

    // Determine watermark size and type 
    $wsize = getimagesize($watermark_path); 
    $watermark_x = $wsize[0]; 
    $watermark_y = $wsize[1]; 
    $watermark_type = $wsize[2]; // 1 = GIF, 2 = JPG, 3 = PNG 



    // load watermark 
    $watermark = $this->ImageCreateFromType($watermark_type, $watermark_path); 

    // where do we put watermark on the image? 
    $dest_x = $size_x - $watermark_x - $this->offset_x; 
    $dest_y = $size_y - $watermark_y - $this->offset_y; 

    imagealphablending($image, true); 
imagecopymerge($image, $watermark, $dest_x, $dest_y, 0, 0, $watermark_x, $watermark_y, 100); 

    $this->image = &$image; 
    $this->watermark = &$watermark; 
    $this->image_type = $image_type; 

    } // ApplyWatermark 

    function OutputImageInternal($filename='') { 

    $im = &$this->image; 
    $res = null; 

    $image_type = ($this->force_image_type != -1 ? $this->force_image_type : $this->image_type); 

    // ImageGIF is not included into some GD2 releases, so it might not work 
    // output png if gifs are not supported 
    if(($image_type == 1) && !function_exists('imagegif')) $image_type = 3; 

    switch ($image_type) { 
     case 1: 
     if ($this->save_to_file) { 
      $res = ImageGIF($im,$filename); 
     } 
     else { 
      header("Content-type: image/gif"); 
      $res = ImageGIF($im); 
     } 
     break; 
     case 2: 
     if ($this->save_to_file) { 
      $res = ImageJPEG($im,$filename,$this->quality); 
     } 
     else { 
      header("Content-type: image/jpeg"); 
      $res = ImageJPEG($im, NULL, $this->quality); 
     } 
     break; 
     case 3: 
     if (PHP_VERSION >= '5.1.2') { 
      // Convert to PNG quality. 
      // PNG quality: 0 (best quality, bigger file) to 9 (worst quality, smaller file) 
      $quality = 9 - min(round($this->quality/10), 9); 
      if ($this->save_to_file) { 
      $res = ImagePNG($im, $filename, $quality); 
      } 
      else { 
      header("Content-type: image/png"); 
      $res = ImagePNG($im, NULL, $quality); 
      } 
     } 
     else { 
      if ($this->save_to_file) { 
      $res = ImagePNG($im, $filename); 
      } 
      else { 
      header("Content-type: image/png"); 
      $res = ImagePNG($im); 
      } 
     } 
     break; 
    } 

    return $res; 

    } 

    function Output($type = -1) { 
    $this->force_image_type = $type; 
    $this->save_to_file = false; 
    $this->OutputImageInternal(); 
    } 

    function SaveAsFile($filename, $type = -1) { 
    $this->force_image_type = $type; 
    $this->save_to_file = true; 
    $this->OutputImageInternal($filename); 
    } 

    function Free() { 
    imagedestroy($this->image); 
    imagedestroy($this->watermark); 
    } 

} 

Répondre

2

Changement de la fonction utilisée dans le code ci-dessus de: imagecopymerged() à: imagecopy()

semblait faire l'affaire!

1

Le imagecopymerged() passer de imagecopy() est définitivement la réponse. Cependant, j'ai toujours lutté avec ce qui précède parce que c'était tout ce que j'ai changé! Il m'a fallu un certain temps pour réaliser que vous deviez supprimer la dernière valeur du imagecopymerged() pour que cela fonctionne avec imagecopy().

Voici quelques détails sur les valeurs requises pour chaque fonction:

int imagecopy (resource dest_image, resource source_image, int dest_x, int dest_y, int source_x, int source_y, int source_width, int source_height) 

int imagecopymerge (resource dest_image, resource source_image, int dest_x, int dest_y, int source_x, int source_y, int source_width, int source_height, int merge_percentage)