ImageManager
[ class tree: ImageManager ] [ index: ImageManager ] [ all elements ]

Source for file api.watermark.php

Documentation is available at api.watermark.php

  1. <?php
  2. /**
  3.  * Watermarking API
  4.  * @author $Author: Brian Vaughn $ http://boynamedbri.com/  -  http://portfolio.boynamedbri.com/ -  @ devshed http://www.devshed.com/c/a/PHP/Dynamic-Watermarking-with-PHP/
  5.  * @author $Author: Paul Moers <mail@saulmade.nl> $ - small changes to place the watermark on a given coordinate and to only handle watermark area
  6.  * @package ImageManager
  7.  */
  8.  
  9. class watermark{
  10.  
  11.     # given two images, return a blended watermarked image
  12.     function create_watermark$main_img_obj$watermark_img_obj$alpha_level 100$watermarkX = -1$watermarkY = -{
  13.         $alpha_level    /= 100;    # convert 0-100 (%) alpha to decimal
  14.     
  15.         # calculate our images dimensions
  16.         $main_img_obj_w    imagesx$main_img_obj );
  17.         $main_img_obj_h    imagesy$main_img_obj );
  18.         $watermark_img_obj_w    imagesx$watermark_img_obj );
  19.         $watermark_img_obj_h    imagesy$watermark_img_obj );
  20.         
  21.         # determine watermark area for given coordinates
  22.         if ($watermarkX > - && $watermarkY > -1)
  23.         {
  24.             $main_img_obj_min_x    $watermarkX;
  25.             $main_img_obj_max_x    $watermarkX $watermark_img_obj_w;
  26.             $main_img_obj_min_y    $watermarkY;
  27.             $main_img_obj_max_y    $watermarkY $watermark_img_obj_h;
  28.         }
  29.         # determine watermark area when centered
  30.         else
  31.         {
  32.             $main_img_obj_min_x    floor( ( $main_img_obj_w $watermark_img_obj_w ) );
  33.             $main_img_obj_max_x    ceil( ( $main_img_obj_w $watermark_img_obj_w ) );
  34.             $main_img_obj_min_y    floor( ( $main_img_obj_h $watermark_img_obj_h ) );
  35.             $main_img_obj_max_y    ceil( ( $main_img_obj_h $watermark_img_obj_h ) );
  36.         }
  37.  
  38.         # create image copy to hold merged changes
  39.         $return_img    $main_img_obj;
  40.  
  41.         # walk through the watermark area
  42.         for$y $main_img_obj_min_y$y $main_img_obj_max_y$y++ {
  43.             for$x $main_img_obj_min_x$x $main_img_obj_max_x$x++ {
  44.                 $return_color    NULL;
  45.                 
  46.                 # determine the correct pixel location within our watermark
  47.                 $watermark_x    $x $main_img_obj_min_x;
  48.                 $watermark_y    $y $main_img_obj_min_y;
  49.                 
  50.                 # fetch color information for both of our images
  51.                 $main_rgb imagecolorsforindex$main_img_objimagecolorat$main_img_obj$x$y ) );
  52.                 
  53.                 # if our watermark has a non-transparent value at this pixel intersection
  54.                 # and we're still within the bounds of the watermark image
  55.                 if (    $watermark_x >= && $watermark_x $watermark_img_obj_w &&
  56.                             $watermark_y >= && $watermark_y $watermark_img_obj_h {
  57.                     $watermark_rbg imagecolorsforindex$watermark_img_objimagecolorat$watermark_img_obj$watermark_x$watermark_y ) );
  58.                     
  59.                     # using image alpha, and user specified alpha, calculate average
  60.                     $watermark_alpha    round( ( ( 127 $watermark_rbg['alpha'127 ));
  61.                     $watermark_alpha    $watermark_alpha $alpha_level;
  62.                 
  63.                     # calculate the color 'average' between the two - taking into account the specified alpha level
  64.                     $avg_red        $this->_get_ave_color$main_rgb['red'],        $watermark_rbg['red'],        $watermark_alpha );
  65.                     $avg_green    $this->_get_ave_color$main_rgb['green'],    $watermark_rbg['green'],    $watermark_alpha );
  66.                     $avg_blue        $this->_get_ave_color$main_rgb['blue'],    $watermark_rbg['blue'],        $watermark_alpha );
  67.  
  68.                     # calculate a color index value using the average RGB values we've determined
  69.                     $return_color    $this->_get_image_color$return_img$avg_red$avg_green$avg_blue );
  70.                     
  71.                 # if we're not dealing with an average color here, then let's just copy over the main color
  72.                 else {
  73.                     $return_color    imagecolorat$main_img_obj$x$y );
  74.                     
  75.                 # END if watermark
  76.         
  77.                 # draw the appropriate color onto the return image
  78.                 imagesetpixel$return_img$x$y$return_color );
  79.         
  80.             # END for each X pixel
  81.         # END for each Y pixel
  82.             
  83.         # return the resulting, watermarked image for display
  84.         return $return_img;
  85.     
  86.     # END create_watermark()
  87.     
  88.     # average two colors given an alpha
  89.     function _get_ave_color$color_a$color_b$alpha_level {
  90.         return round( ( ( $color_a $alpha_level ) ) $color_b    $alpha_level ) ) );
  91.     # END _get_ave_color()
  92.         
  93.     # return closest pallette-color match for RGB values
  94.     function _get_image_color($im$r$g$b{
  95.         $c=imagecolorexact($im$r$g$b);
  96.         if ($c>0return $c;
  97.         $c=imagecolorallocate($im$r$g$b);
  98.         if ($c>0return $c;
  99.         return imagecolorclosest($im$r$g$b);
  100.     # EBD _get_image_color()
  101.  
  102. # END watermark API
  103. ?>

Documentation generated on Thu, 12 Jun 2008 12:59:11 -0500 by phpDocumentor 1.4.1