Pastebin launched a little side project called VERYVIRAL.com, check it out ;-) Want more features on Pastebin? Sign Up, it's FREE!
Guest

Photoshop "Color" blending mode in PHP

By: a guest on Aug 30th, 2012  |  syntax: PHP  |  size: 3.21 KB  |  views: 33  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1. <?php
  2.  
  3.         function Lum($colour) {
  4.                 return ($colour['r'] * 0.3) + ($colour['g'] * 0.59) + ($colour['b'] * 0.11);
  5.         }
  6.  
  7.         function ClipColour($colour) {
  8.             $result     = $colour;
  9.             $luminance  = Lum($colour);
  10.  
  11.             $cMin = min($colour['r'], $colour['g'], $colour['b']);
  12.             $cMax = max($colour['r'], $colour['g'], $colour['b']);
  13.  
  14.             if ($cMin < 0.0) {
  15.                 $result['r'] = $luminance + ((($colour['r'] - $luminance) * $luminance) / ($luminance - $cMin));
  16.                 $result['g'] = $luminance + ((($colour['g'] - $luminance) * $luminance) / ($luminance - $cMin));
  17.                 $result['b'] = $luminance + ((($colour['b'] - $luminance) * $luminance) / ($luminance - $cMin));
  18.             }
  19.  
  20.             if ($cMax > 255) {
  21.                 $result['r'] = $luminance + ((($colour['r'] - $luminance) * (255 - $luminance)) / ($cMax - $luminance));
  22.                 $result['g'] = $luminance + ((($colour['g'] - $luminance) * (255 - $luminance)) / ($cMax - $luminance));
  23.                 $result['b'] = $luminance + ((($colour['b'] - $luminance) * (255 - $luminance)) / ($cMax - $luminance));
  24.             }
  25.  
  26.             return $result;
  27.         }
  28.  
  29.         function SetLum($colour, $luminance) {
  30.  
  31.             $result = array();
  32.  
  33.             $diff =   $luminance - Lum($colour);
  34.  
  35.             $result['r'] = $colour['r'] + $diff;
  36.             $result['g'] = $colour['g'] + $diff;
  37.             $result['b'] = $colour['b'] + $diff;
  38.  
  39.             return ClipColour($result);
  40.  
  41.         }
  42.  
  43.         function normalizeColor( $color ) {
  44.                 $color['r'] = $color['r'] / 255;
  45.                 $color['g'] = $color['g'] / 255;
  46.                 $color['b'] = $color['b'] / 255;
  47.  
  48.                 return $color;
  49.         }
  50.        
  51.         function denormalizeColor( $color ) {
  52.                 $color['r'] = round($color['r'] * 255);
  53.                 $color['g'] = round($color['g'] * 255);
  54.                 $color['b'] = round($color['b'] * 255);
  55.  
  56.                 return $color;
  57.         }
  58.  
  59.         $overlay_color = array('r'=>180,'g'=>22,'b'=>1, 'a' => 0.35);
  60.  
  61.         $img = new Imagick();
  62.  
  63.         if( !isset($_GET['case']) ) {
  64.                 $_GET['case'] = '';
  65.         }
  66.        
  67.         //unmodified version
  68.         $original       = new Imagick('girl.jpg');
  69.                        
  70.         //photoshop image to compare
  71.         $ps = new Imagick('original.jpg');
  72.  
  73.         $img->addImage($original);
  74.         $it = $original->getPixelIterator();
  75.  
  76.         foreach( $it as $row => $pixels ) {
  77.             foreach ( $pixels as $column => $pixel ) {
  78.             $rgbIni = $pixel->getColor();
  79.                
  80.                         $rgb = SetLum($overlay_color, Lum($rgbIni));
  81.                          $overlay_color         = normalizeColor($overlay_color);
  82.                                 $rgb            = normalizeColor($rgb);
  83.  
  84.                                 $rgbIni                 = normalizeColor($rgbIni);
  85.  
  86.                         $rgb['r'] = ((1 - $overlay_color['a']) * $rgbIni['r']) + ($overlay_color['a'] * $rgb['r']);
  87.                         $rgb['g'] = ((1 - $overlay_color['a']) * $rgbIni['g']) + ($overlay_color['a'] * $rgb['g']);
  88.                         $rgb['b'] = ((1 - $overlay_color['a']) * $rgbIni['b']) + ($overlay_color['a'] * $rgb['b']);
  89.  
  90.                         $test                   = denormalizeColor($test);
  91.             $rgb                        = denormalizeColor($rgb);
  92.             $overlay_color      = denormalizeColor($overlay_color);
  93.  
  94.                         $pixel->setColor('rgb('.round($rgb['r']).','. round($rgb['g']).','.round($rgb['b']).')');
  95.  
  96.             }
  97.  
  98.             $it->syncIterator();
  99.         }
  100.  
  101.         //add modified version
  102.         $img->addImage($original);
  103.         $img->addImage($ps);
  104.  
  105.         $img->resetIterator();
  106.         $combined = $img->appendImages(true); //stack images
  107.  
  108.         header('content-type: image/jpeg');
  109.  
  110.         $combined->setImageFormat("jpeg");
  111.  
  112.         echo $combined;
  113.  
  114. ?>
clone this paste RAW Paste Data