Zend - The PHP Company




Graphics

Add Code


imageFiltersIndex  

Type: class library
Added by: darkelder
Entered: 29/11/2002
Last modified: 01/11/2001
Rating: - (fewer than 3 votes)
Views: 6413
A set of filters that works around the image index, changing it like grayscale filter and sepia filter. It requires uses GD.


<?PHP

/**
  *
  * imageFiltersIndex
  *
  * A set of filters that works around the image index, changing it.
  *
  * It requires GD library.
  *
  * If you want to add a new filter (like redizer or greenizer) in this class,
  * please sent it to Roberto Berto <darkelder@php.net>
  *
  *
  * Main methods:
  * - resource                  Should be used to set a GD image resource to work
  *
  *
  * Currently Filters:
  * - grayscale                 Turn an image grayscale [since 1.0]
  * - sepia                     Turn an image older than it is [since 1.0]
  * - yellowize                 Add a yellow layer in the front of image (transparent or solid) [since 1.0]
  *
  *
  * Usage:
  *
  *     $img_src                = ImageCreateFromJpeg("image.jpg");
  *     $imageFiltersIndex      = new imageFiltersIndex;
  *     $imageFiltersIndex->resource($img_src);
  *     $imageFiltersIndex->filter([$options1],[$options2,...]);
  *
  *  Where filter is the filter name and $options is a filter option.
  *  All imageFilterIndex should have some defaults filters options, so you do not need to
  *     use options if you do not want to.
  *
  *
  * Example:
  *
  * $img_src_file = "file.jpg";
  *
  * $img_src=ImageCreateFromJpeg($img_src_file);
  *
  * $imageFiltersIndex = new imageFiltersIndex;
  * $imageFiltersIndex->resource($img_src);
  * $imageFiltersIndex->sepia();
  *
  * header("Content-type: image/jpeg");
  * imagejpeg($img_src,"",50);
  *
  *
  * Resources:
  * - more filters algorithms at http://www.thecodeproject.com/cs/media/csharpgraphicfilters11.asp (I found
  *     sepia there. You can get some nice ideas there and submit the filters you wrote here)
  * - a nice color class at http://darkelder.users.phpclasses.org/browse.html/package/479.html
  *
  * @author             Roberto Berto <darkelder@php.net>
  * @colaborators       ??
  * @date               2002-11-29
  * @license            LGPL (http://www.gnu.org/licenses/lgpl.html)
  * @changes            1.0                     first version
  *
 *
  * Copyright (C) 2002 Roberto Berto
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
  * License as published by the Free Software Foundation; either
  * version 2.1 of the License, or (at your option) any later version.
  *
  * This library is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  * Lesser General Public License for more details.
  *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  *
  */

class imageFiltersIndex
{
        var     
$resource_image                 0;
        var     
$numColors                      0;

        
/**
          * Register the Image Resource (from gd)
          *
          * Each new image to be filtred must call this register
          *
          * What it does is set a link to $this->resource_image and
          * get the number of colors and set it to $this->numColors
          *
          * @param      int     $resource_image         GD image resource
          */
        
function resource($resource_image)
        {
                
$this->resource_image           =&      $resource_image;

                
$this->numColors imagecolorstotal($this->resource_image);
        }


        
/**
          * Turn image to Grayscale
          *
          * The basic of grayscale is that we must turn 3 colors into 1 color.
          *
          * So, if you sum R+B+G and / 3 you will get just one color and you
          *  should use this new color in R, B and G.
          *
          * But, I found on the http://www.thecodeproject.com/cs/media/csharpgraphicfilters11.asp
          *  that if I multiple, instead of multiple by 1/3, each color by .229, .587 and .114
          *  and add +3 on the color index, we will get a better image. I have not sure the why.
          *
          * @param      float   $rateR          the rate of Red in the new color ($rateR/1000)
          * @param      float   $rateG          the rate of Green in the new color ($rateG/1000)
          * @param      float   $rateB          the rate of Blue in the new color ($rateB/1000)
          * @param      int     $whiteness      add more some int on the new color ($newcolor += $whiteness)
          */
        
function grayscale($rateR .229,$rateG .587,$rateB .114,$whiteness 3)
        {
                for (
$x 0$x $this->numColors$x++)
                {
                        
$src_colors     imagecolorsforindex($this->resource_image,$x);
                        
$new_color      min(255,abs($src_colors["red"] * $rateR $src_colors["green"] * $rateG $src_colors["blue"] * $rateB) + $whiteness);
                        
imagecolorset($this->resource_image,$x,$new_color,$new_color,$new_color);
                }
        }


        
/**
          * Sepia - make image pretends to be older than it really is
          *
          * It basicly turn the image grayscale and add some defined
          * tint on it: R += 30, G += 43, B += -23, so it will appear a very old picture.
          *
          * @param      int     $tintR          how much Red to add
          * @param      int     $tintG          how much Green to add
          * @param      int     $tintB          how much Blue to add
          * @param      float   $rateR          the rate of Red in the new color ($rateR/1000)
          * @param      float   $rateG          the rate of Green in the new color ($rateG/1000)
          * @param      float   $rateB          the rate of Blue in the new color ($rateB/1000)
          * @param      int     $whiteness      add more some int on the new color ($newcolor += $whiteness)
          */
        
function sepia($tintR 80,$tintG 43,$tingB = -23,$rateR .229,$rateG .587,$rateB .114,$whiteness 3)
        {

                for (
$x 0$x $this->numColors$x++)
                {
                        
$src_colors     imagecolorsforindex($this->resource_image,$x);
                        
$new_color      min(255,abs($src_colors["red"] * $rateR $src_colors["green"] * $rateG $src_colors["blue"] * $rateB) + $whiteness);
                        
$r              min(255,$new_color $tintR);
                        
$g              min(255,$new_color $tintG);
                        
$b              min(255,$new_color $tintB);
                        
imagecolorset($this->resource_image,$x,$r,$g,$b);
                }
        }


        
/**
          * Add more yellow
          *
          * It adds a layout of yellow that can be transparent or solid
          * If $intensityA is 255 the image will be 0% transparent (solid).
          *
          * @param      int $intensityA         how much strong it will be the yellow (Red and Green) (Something between 0-255)
          * @param      int $intensityB         how much weak will be the Blue (>= 2, in the positive limit it will be make BLUE be 0)
          */
        
function yelloize($intensityA 50,$intensityB 3)
        {
                for (
$x 0$x $this->numColors$x++)
                {
                        
$src_colors     imagecolorsforindex($this->resource_image,$x);
                        
$r              min($src_colors["red"] + $intensityA,255);
                        
$g              min($src_colors["green"] + $intensityA,255);
                        
$b              max(($r $g) / max($intensityB,2),0);
                        
imagecolorset($this->resource_image,$x,$r,$g,$b);
                }
        }


}

?>


Usage Example


See the example


Rate This Script





Search



This Category All Categories