2009-11-13 6 views
4

J'utilise ce code pour créer un filigrane.Filigrane PHP

$image = '1.jpg'; 
    $overlay = 'stamp.png'; 
    $opacity = "20"; 
    if (!file_exists($image)) { 
     die("Image does not exist."); 
    } 
    // Set offset from bottom-right corner 
    $w_offset = 0; 
    $h_offset = 100; 
    $extension = strtolower(substr($image, strrpos($image, ".") + 1)); 
    // Load image from file 
    switch ($extension) 
    { 
     case 'jpg': 
     $background = imagecreatefromjpeg($image); 
     break; 
     case 'jpeg': 
     $background = imagecreatefromjpeg($image); 
     break; 
     case 'png': 
     $background = imagecreatefrompng($image); 
     break; 
     case 'gif': 
     $background = imagecreatefromgif($image); 
     break; 
     default: 
     die("Image is of unsupported type."); 
    } 
    // Find base image size 
    $swidth = imagesx($background); 
    $sheight = imagesy($background); 
    // Turn on alpha blending 
    imagealphablending($background, true); 
    // Create overlay image 
    $overlay = imagecreatefrompng($overlay); 
    // Get the size of overlay 
    $owidth = imagesx($overlay); 
    $oheight = imagesy($overlay); 
    // Overlay watermark 
    imagecopymerge($background, $overlay, $swidth - $owidth - $w_offset, $sheight - $oheight - $h_offset, 0, 0, $owidth, $oheight, $opacity); 
    imagejpeg($background,$image); 
    // Destroy the images 
    imagedestroy($background); 
    imagedestroy($overlay); 

l'image png contient un texte avec toutes les autres régions comme transparentes. mais quand j'exécute ce code, il applique le png sur jpg, mais la transparence n'est pas maintenue du png. ça se voit dans une boîte.

comment puis-je y parvenir. c'est-à-dire si un png contient une partie transaparent, il devrait montrer l'image ci-dessous dans cette partie ....?

+0

Obtenir le type d'image à partir de l'extension de fichier est une approche naïve: utilisez plutôt getimagesize()! – ntd

Répondre

4

Voici le nouveau code

function watermark($image){ 
    $overlay = '../../../photos/photosets/stamp.png'; 
    $opacity = "20"; 
    if (!file_exists($image)) { 
     die("Image does not exist."); 
    } 
    // Set offset from bottom-right corner 
    $w_offset = 0; 
    $h_offset = 100; 
    $extension = strtolower(substr($image, strrpos($image, ".") + 1)); 
    // Load image from file 
    switch ($extension) 
    { 
     case 'jpg': 
     $background = imagecreatefromjpeg($image); 
     break; 
     case 'jpeg': 
     $background = imagecreatefromjpeg($image); 
     break; 
     case 'png': 
     $background = imagecreatefrompng($image); 
     break; 
     case 'gif': 
     $background = imagecreatefromgif($image); 
     break; 
     default: 
     die("Image is of unsupported type."); 
    } 
    // Find base image size 
    $swidth = imagesx($background); 
    $sheight = imagesy($background); 
    // Turn on alpha blending 
    imagealphablending($background, true); 
    // Create overlay image 
    //$overlay = imagecreatefrompng($overlay); 
    // Get the size of overlay 
    $owidth = imagesx($overlay); 
    $oheight = imagesy($overlay); 

    $photo = imagecreatefromjpeg($image); 
    $watermark = imagecreatefrompng($overlay); 
      // This is the key. Without ImageAlphaBlending on, the PNG won't render correctly. 
    imagealphablending($photo, true); 
      // Copy the watermark onto the master, $offset px from the bottom right corner. 
    $offset = 10; 
    imagecopy($photo, $watermark, imagesx($photo) - imagesx($watermark) - $offset, imagesy($photo) - imagesy($watermark) - $offset, 0, 0, imagesx($watermark), imagesy($watermark)); 
      // Output to the browser 
    header("Content-Type: image/jpeg"); 
    imagejpeg($photo,$image); 
    // Overlay watermark 
    // Destroy the images 
    imagedestroy($background); 
    imagedestroy($overlay); 
} 
3

Le format jpg ne prend pas en charge la transparence, donc sur le plan conceptuel, vous aurez à:

  • saisir les pixels de l'image (le jpeg) et les mettre dans un tampon
  • saisir la pixels non transparents de l'image plus petite (le filigrane) et déplacez-les dans ce tampon, en appliquant l'alpha le long du chemin

Vous voulez probablement laisser une bibliothèque le faire. J'aime ImageMagick, surtout depuis qu'il est construit en php ... voici un exemple de la façon de l'utiliser à cet effet à partir de PHP:

// Let's read the images. 
$glasses = new Imagick(); 
if (FALSE === $glasses->readImage($dir . '/glasses.png')) 
{ 
    throw new Exception(); 
} 

$face = new Imagick(); 
if (FALSE === $face->readImage($dir . '/face.jpg')) 
{ 
    throw new Exception(); 
} 

// Let's put the glasses on (10 pixels from left, 20 pixels from top of face). 
$face->compositeImage($glasses, Imagick::COMPOSITE_DEFAULT, 10, 20); 

Et here's the link à la page du manuel PHP pour ImageMagick :: compositeImage (dont l'exemple ci-dessus est venu). Le remplacement de imagecopymerge par imagecopy a permis de résoudre le problème.

Questions connexes