2011-04-13 4 views
0

Comment placer une marque d'eau sur l'image sans affecter l'image source.Comment mettre en filigrane sur l'image?

$SourceFile = '/uploadedimage/gallery/thumble/'; 
$DestinationFile = '/uploadedimage/gallery/thumble/image-watermark.jpg'; 
$WaterMarkText = 'Copyright appsbee.com'; 
watermarkImage ($SourceFile, $WaterMarkText, $DestinationFile); 



function watermarkImage ($SourceFile, $WaterMarkText, $DestinationFile) { 
    list($width, $height) = getimagesize($SourceFile); 
    $image_p = imagecreatetruecolor($width, $height); 
    $image = imagecreatefromjpeg($SourceFile); 
    imagecopyresampled($image_p, $image, 0, 0, 0, 0, $width, $height, $width, $height); 
    $black = imagecolorallocate($image_p, 0, 0, 0); 
    $font = 'arial.ttf'; 
    $font_size = 10; 
    imagettftext($image_p, $font_size, 0, 10, 20, $black, $font, $WaterMarkText); 
    if ($DestinationFile<>'') { 
     imagejpeg ($image_p, $DestinationFile, 100); 
    } else { 
     header('Content-Type: image/jpeg'); 
     imagejpeg($image_p, null, 100); 
    }; 
    imagedestroy($image); 
    imagedestroy($image_p); 
}; 

Si je le fais, les images présentes sur le dossier de presse sont effacées.

+0

Veuillez ajouter plus de contexte. Qu'est-ce que vous avez besoin de cela? Pourquoi l'image originale ne doit-elle pas être affectée? S'il vous plaît clarifier –

+1

Vous devez faire une copie de votre image source et l'utiliser pour la manipulation – JohnP

Répondre

1

sans affecter l'image source.

Ceci sans affecter l'image réelle est possible uniquement en ajoutant une couche HTML contenant une image transparente. Cependant, cela est plutôt inutile en tant que moyen de protection, car tout le monde avec un petit peu de connaissances techniques peut récupérer l'image originale en quelques secondes.

0

Utilisation de la bibliothèque GD: http://php.net/manual/en/book.image.php

De cette façon, je créerais une version de filigrane Web de l'image et stocker aussi l'image source. À moins que vous n'ayez l'intention d'ajouter un filigrane à la volée, auquel cas je ne suis pas sûr de pouvoir le faire facilement.

0

Si vous ne voulez pas affecter l'image source, alors je vous recommande de placer une image transparente dans un div positionné sur l'image dans votre code HTML. Cela signifie que vous n'avez pas à traiter une image sur chaque chargement de page (parce que vous voulez conserver l'original intact), et vous n'avez pas besoin de stocker une image supplémentaire.

2

Utilisez cette classe, avant de mettre la marque d'eau faites juste la copie de l'image originale.

<?php 
class Watermark{ 
    # given two images, return a blended watermarked image 
    # given two images, return a blended watermarked image 
    function create_watermark($main_img_obj, $watermark_img_obj, $alpha_level = 100) { 
     $alpha_level /= 100; # convert 0-100 (%) alpha to decimal 
     # calculate our images dimensions 
     $main_img_obj_w = imagesx($main_img_obj); 
     $main_img_obj_h = imagesy($main_img_obj); 
     $watermark_img_obj_w = imagesx($watermark_img_obj); 
     $watermark_img_obj_h = imagesy($watermark_img_obj); 
     # determine center position coordinates 
     $main_img_obj_min_x = floor(($main_img_obj_w/2) - ($watermark_img_obj_w/2)); 
     $main_img_obj_max_x = ceil(($main_img_obj_w/2) + ($watermark_img_obj_w/2)); 
     $main_img_obj_min_y = floor(($main_img_obj_h/2) - ($watermark_img_obj_h/2)); 
     $main_img_obj_max_y = ceil(($main_img_obj_h/2) + ($watermark_img_obj_h/2)); 
     # create new image to hold merged changes 
     $return_img = imagecreatetruecolor($main_img_obj_w, $main_img_obj_h); 
     # walk through main image 
     for($y = 0; $y < $main_img_obj_h; $y++) { 
      for($x = 0; $x < $main_img_obj_w; $x++) { 
       $return_color  = NULL; 

       # determine the correct pixel location within our watermark 
       $watermark_x  = $x - $main_img_obj_min_x; 
       $watermark_y  = $y - $main_img_obj_min_y; 

       # fetch color information for both of our images 
       $main_rgb = imagecolorsforindex($main_img_obj, imagecolorat($main_img_obj, $x, $y)); 

       # if our watermark has a non-transparent value at this pixel intersection 
       # and we're still within the bounds of the watermark image 
       if ( $watermark_x >= 0 && $watermark_x < $watermark_img_obj_w && 
       $watermark_y >= 0 && $watermark_y < $watermark_img_obj_h) { 
        $watermark_rbg = imagecolorsforindex($watermark_img_obj, imagecolorat($watermark_img_obj, $watermark_x, $watermark_y)); 

        # using image alpha, and user specified alpha, calculate average 
        $watermark_alpha = round(((127 - $watermark_rbg['alpha'])/127), 2); 
        $watermark_alpha = $watermark_alpha * $alpha_level; 

        # calculate the color 'average' between the two - taking into account the specified alpha level 
        $avg_red   = $this->_get_ave_color($main_rgb['red'],   $watermark_rbg['red'],  $watermark_alpha); 
        $avg_green = $this->_get_ave_color($main_rgb['green'],  $watermark_rbg['green'],  $watermark_alpha); 
        $avg_blue   = $this->_get_ave_color($main_rgb['blue'],  $watermark_rbg['blue'],  $watermark_alpha); 

        # calculate a color index value using the average RGB values we've determined 
        $return_color  = $this->_get_image_color($return_img, $avg_red, $avg_green, $avg_blue); 

        # if we're not dealing with an average color here, then let's just copy over the main color 
       } else { 
        $return_color  = imagecolorat($main_img_obj, $x, $y); 

       } # END if watermark 

       # draw the appropriate color onto the return image 
       imagesetpixel($return_img, $x, $y, $return_color); 

      } # END for each X pixel 
     } # END for each Y pixel 
     # return the resulting, watermarked image for display 
     return $return_img; 
    } # END create_watermark() 

    # average two colors given an alpha 
    function _get_ave_color($color_a, $color_b, $alpha_level) { 
     return round((($color_a * (1 - $alpha_level)) + ($color_b * $alpha_level))); 
    } # END _get_ave_color() 

    # return closest pallette-color match for RGB values 
    function _get_image_color($im, $r, $g, $b) { 
     $c=imagecolorexact($im, $r, $g, $b); 
     if ($c!=-1) return $c; 
     $c=imagecolorallocate($im, $r, $g, $b); 
     if ($c!=-1) return $c; 
     return imagecolorclosest($im, $r, $g, $b); 
    } # EBD _get_image_color() 
} # END watermark API 
?> 

ce qui est de savoir comment utiliser

$watermark = new Watermark(); 
     $actual_image = imagecreatefromjpeg("images/$image_file"); 
     $watermark_image = imagecreatefrompng("images/water_mark.png"); 
     //create water marked image with 66% transparency 
     $return_img_obj = $watermark->create_watermark($actual_image, $watermark_image, 66); 

     //now save the updated image 
     imagejpeg($return_img_obj,"images/$image_file1"); 

     //clear the memory 
     imagedestroy($actual_image); 
     imagedestroy($watermark_image); 
     imagedestroy($return_img_obj); 
0

De la première vue, je pense que ce code n'affectera pas le fichier source si u n'a pas fourni un nom de fichier de destination à la fonction.