<?php

  
class Transparentizer {

    
/**
     * The colour around the edges of the primary image to replace
     * aka the background colour
     * 
     * @var string
     */
    
private $colour "FFFFFF";

    
/**
     * Temporary middleman replacement colour to transparent
     * Should be something unique not otherwise found
     * in the image, like hot pink
     *
     * @var string
     */
    
private $replace "FF00FF";

    
/**
     * Accuracy/threashold of colour difference to replace
     * 
     * @var int
     */
    
private $threshold 145;

    
/**
     * Image file location
     * 
     * @var string
     */
    
private $image "";

    
/**
     * Calculate the Pythagorean distance between two colors
     *
     * Borrowed from
     * http://www.splitbrain.org/blog/2008-09/18-calculating_color_contrastwith_php
     *
     * @param int $R1
     * @param int $G1
     * @param int $B1
     * @param int $R2
     * @param int $G2
     * @param int $B2
     * @return float
     */
    
private function colordiff($R1,$G1,$B1,$R2,$G2,$B2){
      
$RD $R1 $R2;
      
$GD $G1 $G2;
      
$BD $B1 $B2;
      return  
sqrt$RD $RD $GD $GD $BD $BD ) ;
    }

    
/**
     * Turns an HTML hex color code (i.e. FFFFFF) into it's
     * RGB value (i.e. 255, 255, 255)
     *
     * http://php.net/manual/en/function.imagecolordeallocate.php
     *
     * @param string $input
     * @return array
     */
    
private function html2rgb($input) {
      
$input=($input[0]=="#")?substr($input1,6):substr($input0,6);
      return array(
        
'r'=>hexdecsubstr($input02) ),
        
'g'=>hexdecsubstr($input22) ),
        
'b'=>hexdecsubstr($input42) )
      );
    }

    
/**
     * Construct new Transparenterizer
     *
     * @param string $image Image file location (JPEG)
     * @param string $colour HEX colour code to replace
     * @param int $threshold Accuracy/threshold
     * @param string $replace Temporary replacement colour
     */
    
public function __construct($image$colour$threshold$replace null) {
      if (!
file_exists($image))
        throw new 
Exception("Could not find file {$image} for processing.");
      
$this->image $image;
      
// just accept whatever color, html2rgb will handle it
      
$this->colour $colour;
      
$this->threshold = (int) $threshold;
      if (
$replace$this->replace $replace;
    }

    
/**
     * Output the image and proper headers
     */
    
public function output() {
      
header("Content-Type: image/png");

      list(
$w$h$type$attr) = getimagesize($this->image);
      
$img imagecreatefromjpeg($this->image);

      
// get replacement color RGB and allocate to image
      
list($r_r$r_g$r_b) = array_values($this->html2rgb($this->replace));
      
$replace imagecolorallocate($img$r_r$r_g$r_b);

      
// get the "find" colour (that needs to be transparenterized)
      
list($f_r$f_g$f_b) = array_values($this->html2rgb($this->colour));

       
// go downwards on the y axis
      
for($y 0$y $h$y++) {

        
// left to right
        
for($x 0$x $w$x++) {

          
// get colour at this coordinate and RGB it
          
$color array_values(imagecolorsforindex($img,
                  
imagecolorat($img$x$y)));
          list(
$r$g$b$a) = array_values($color);

          
// calculate diff
          
$color_diff $this->colordiff($r$g$b$f_r$f_g$f_b);

          
// replace or go to the next line?
          
if ($color_diff <= $this->threshold) {
            
// replace with color
            
imagefilledrectangle($img$x$y$x$y$replace);
          } else {
            break;
          }
        }
        
        
// right to left
        
for($x $w 1$x >= 0$x--) {

          
// get colour at this coordinate and RGB it
          
$color array_values(imagecolorsforindex($img,
                  
imagecolorat($img$x$y)));
          list(
$r$g$b$a) = array_values($color);

          
// calculate diff
          
$color_diff $this->colordiff($r$g$b$f_r$f_g$f_b);

          
// replace or go to the next line?
          
if ($color_diff <= $this->threshold) {
            
// replace with color
            
imagefilledrectangle($img$x$y$x$y$replace);
          } else {
            break;
          }
        }

      }

      
// now replace the replacement color with transparent and output
      
imagecolortransparent($img$replace);
      
imagepng($img);
    }

  }

  if (isset(
$_POST["submit"]) && isset($_POST["colour"]) &&
          isset(
$_POST["threshold"]) && isset($_FILES["image"])) {

    if (
$_FILES["image"]["type"] != "image/jpeg")
      throw new 
Exception("File must be of JPEG format");

    
$t = new Transparentizer($_FILES["image"]["tmp_name"], $_POST["colour"],
            
$_POST["threshold"]);

    
$t->output();
  } else {

?>

  <form method="post" action="" enctype="mutlipart/form-data">

    <p>Image File: JPEG/JPG:<br />
      <input type="file" name="image" /></p>

    <p>Background/Edge Colour:<br />
      #<input type="text" name="colour" value="FFFFFF" /></p>

    <p>Threshold:<br />
      <input type="text" name="threshold" value="145" /></p>

    <p><input type="submit" name="submit" value="Transparentize" /></p>

  </form>


<?php

  
}