Advertisement
Guest User

Photoshop "Color" blending mode in PHP

a guest
Aug 30th, 2012
172
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 3.21 KB | None | 0 0
  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. ?>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement