PHP рдФрд░ ImageMagick рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ Instagram рдлрд╝рд┐рд▓реНрдЯрд░ рдмрдирд╛рдПрдВред

рдЫрд╡рд┐

рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рджрд┐рдЦрд╛рдКрдВрдЧрд╛ рдХрд┐ PHP рдФрд░ ImageMagick рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдлрд╝реЛрдЯреЛ (рдЬреИрд╕реЗ рдЗрдВрд╕реНрдЯрд╛рдЧреНрд░рд╛рдо рдкрд░) рдкрд░ рдХреБрдЫ рдкреНрд░рднрд╛рд╡ рдХреИрд╕реЗ рдмрдирд╛рдПрдВред

PHP рдХреЗ рд╕рд╛рде рдЗрдореЗрдЬ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ


PHP GD (GIF рдбреНрд░рд╛ / рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдбреНрд░рд╛) рдХреЗ рд╕рд╛рде рдмрдВрдбрд▓ рдореЗрдВ рдЖрддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рд░рд▓ рдЫрд╡рд┐ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдЖрдХрд╛рд░ рдмрджрд▓рдирд╛, рдХреНрд░реЙрдк рдХрд░рдирд╛, рд╡реЙрдЯрд░рдорд╛рд░реНрдХ рдЬреЛрдбрд╝рдирд╛ рдФрд░ рдердВрдмрдиреЗрд▓ рдмрдирд╛рдирд╛ред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдпрджрд┐ рдЖрдк рдЬреАрдбреА рдХреЗ рд╕рд╛рде рдХреБрдЫ рдФрд░ рдЬрдЯрд┐рд▓ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ ImageMagick рд╣реИ!

рдЬреАрдбреА рдмрдирд╛рдо ImageMagick


рдЖрдЗрдП рдЫрд╡рд┐ рдХреЗ рдЖрдХрд╛рд░ рдХреЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЛ рджреЗрдЦреЗрдВред

рдЬреАрдбреА:

$im = imagecreatefromjpeg('photo.jpg'); $ox = imagesx($im); $oy = imagesy($im); $nx = 640; $ny = 480; $nm = imagecreatetruecolor($nx, $ny); imagecopyresized($nm,$im,0,0,0,0,$nx,$ny,$ox,$oy); imagejpeg($nm, 'photo.jpg'); 


ImageMagick:

IM (ImageMagick рдХреЗ рд▓рд┐рдП рдЫреЛрдЯрд╛) рдореЗрдВ рдЗрдореЗрдЬрд┐рдХ рдирд╛рдордХ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╢реЗрд▓ рд╣реИ, рдЬреЛ ImageMickick API рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЪрд┐рддреНрд░ рдмрдирд╛рдиреЗ рдФрд░ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореВрд▓ PHP рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд╣реИред рдПрдХрдорд╛рддреНрд░ рдирдХрд╛рд░рд╛рддреНрдордХ: рдпрд╣ PECL рд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рд╣реИ, рдЬреЛ рдХрднреА-рдХрднреА рд╕рд╛рдЭрд╛ рд╣реЛрд╕реНрдЯрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред

 $image = new Imagick('photo.jpg'); $image->resizeImage(640, 480, imagick::FILTER_LANCZOS, 0.9); 


рдФрд░ рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдФрд░ рднреА рдЖрд╕рд╛рди рд╣реИ:

 exec('mogrify -resize 640x480 photo.jpg'); 


ImageMagick рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ


рд▓рд┐рдВрдХ рдХрд╛ рдкрд╛рд▓рди рдХрд░реЗрдВ, рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдЪреБрдиреЗрдВ (рдпреВрдирд┐рдХреНрд╕ / рдореИрдХ / рд╡рд┐рди) рдФрд░ рдЕрдиреБрд╢рдВрд╕рд┐рдд рдкреИрдХреЗрдЬ рдХрд╛ рдЪрдпрди рдХрд░реЗрдВред

рд╕реНрдерд╛рдкрдирд╛ рдкреВрд░реНрдг рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдЯрд░реНрдорд┐рдирд▓ / рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдкрд░ рдЬрд╛рдПрдВ, рдХрдиреНрд╡рд░реНрдЯ рдЯрд╛рдЗрдк рдХрд░реЗрдВ рдФрд░ рдПрдВрдЯрд░ рджрдмрд╛рдПрдВ, рдЕрдЧрд░ рдЖрдкрдХреЛ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреА рд╕реВрдЪреА рдорд┐рд▓рддреА рд╣реИ, рдФрд░ "рдХрдорд╛рдВрдб рдирд╣реАрдВ рдорд┐рд▓реА", рддреЛ рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реИ! рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЖрдкрдХреЛ PHP рдореЗрдВ рдХреБрдЫ рднреА рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

рдЗрдВрд╕реНрдЯрд╛рдЧреНрд░рд╛рдо - PHP рд╡рд░реНрдЧ


рдореИрдВрдиреЗ рдПрдХ рдЫреЛрдЯреА рд╕реНрдХреНрд░рд┐рдкреНрдЯ, рдПрдХ PHP рдХреНрд▓рд╛рд╕ рдмрдирд╛рдИ, рддрд╛рдХрд┐ рдЫрд╡рд┐рдпреЛрдВ рдХреЛ рдпрдерд╛рд╕рдВрднрд╡ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╣реЛ рд╕рдХреЗред
  1. colortone: рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдФрд░ / рдпрд╛ рдЫрд╛рдпрд╛ рдореЗрдВ рдЫрд╡рд┐ рдХреЗ рд░рдВрдЧ рдЯреЛрди рдХреА рдЗрдЪреНрдЫрд╛ред
  2. рд╡рд┐рдЧрдиреЗрдЯ: рдЫрд╡рд┐ рдХреЗ рдХрд┐рдирд╛рд░реЛрдВ рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
  3. рдмреЙрд░реНрдбрд░: рдлреЛрдЯреЛ рдореЗрдВ рдмреЙрд░реНрдбрд░ рдЬреЛрдбрд╝рддрд╛ рд╣реИред
  4. рдлреНрд░реЗрдо: рдлреЛрдЯреЛ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рджрд┐рдП рдЧрдП рдлреНрд░реЗрдо рдХреЛ рдкрдврд╝реЗрдЧрд╛ред
  5. рдЕрд╕реНрдерд╛рдпреА: рдПрдХ рдЕрд╕реНрдерд╛рдпреА рдлрд╝рд╛рдЗрд▓ (рдореВрд▓ рдЫрд╡рд┐ рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐) рдмрдирд╛рддрд╛ рд╣реИред
  6. рдЖрдЙрдЯрдкреБрдЯ: рдХрд╛рд░реНрдпрд╢реАрд▓ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдирд╛рдо рдмрджрд▓реЗрдВ
  7. рдирд┐рд╖реНрдкрд╛рджрд┐рдд: рдХрдорд╛рдВрдб рднреЗрдЬреЗрдВ


рдПрдХ рдирдИ рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдБ, рдЬрд┐рд╕реЗ instagraph.php рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдкреЗрд╕реНрдЯ рдХрд░реЗрдВред

 /** * Instagram filters with PHP and ImageMagick * * @package Instagraph * @author Webarto <dejan.marjanovic@gmail.com> * @copyright NetTuts+ * @license http://creativecommons.org/licenses/by-nc/3.0/ CC BY-NC */ class Instagraph { public $_image = NULL; public $_output = NULL; public $_prefix = 'IMG'; private $_width = NULL; private $_height = NULL; private $_tmp = NULL; public static function factory($image, $output) { return new Instagraph($image, $output); } public function __construct($image, $output) { if(file_exists($image)) { $this->_image = $image; list($this->_width, $this->_height) = getimagesize($image); $this->_output = $output; } else { throw new Exception('File not found. Aborting.'); } } public function tempfile() { # copy original file and assign temporary name $this->_tmp = $this->_prefix.rand(); copy($this->_image, $this->_tmp); } public function output() { # rename working temporary file to output filename rename($this->_tmp, $this->_output); } public function execute($command) { # remove newlines and convert single quotes to double to prevent errors $command = str_replace(array("\n", "'"), array('', '"'), $command); $command = escapeshellcmd($command); # execute convert program exec($command); } /** ACTIONS */ public function colortone($input, $color, $level, $type = 0) { $args[0] = $level; $args[1] = 100 - $level; $negate = $type == 0? '-negate': ''; $this->execute("convert {$input} ( -clone 0 -fill '$color' -colorize 100% ) ( -clone 0 -colorspace gray $negate ) -compose blend -define compose:args=$args[0],$args[1] -composite {$input}"); } public function border($input, $color = 'black', $width = 20) { $this->execute("convert $input -bordercolor $color -border {$width}x{$width} $input"); } public function frame($input, $frame) { $this->execute("convert $input ( '$frame' -resize {$this->_width}x{$this->_height}! -unsharp 1.5├Ч1.0+1.5+0.02 ) -flatten $input"); } public function vignette($input, $color_1 = 'none', $color_2 = 'black', $crop_factor = 1.5) { $crop_x = floor($this->_width * $crop_factor); $crop_y = floor($this->_height * $crop_factor); $this->execute("convert ( {$input} ) ( -size {$crop_x}x{$crop_y} radial-gradient:$color_1-$color_2 -gravity center -crop {$this->_width}x{$this->_height}+0+0 +repage ) -compose multiply -flatten {$input}"); } /** RESERVED FOR FILTER METHODS */ } 


рджреЗрдЦрддреЗ рд╣реИрдВ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ


рдореВрд▓ рдЫрд╡рд┐:

рдЫрд╡рд┐

рдЧреЛрдердо рдлрд┐рд▓реНрдЯрд░

рдЧреЛрдердо рдлрд┐рд▓реНрдЯрд░ рдЫрд╡рд┐ рдХреЛ рдХрд╛рд▓реЗ рдФрд░ рд╕рдлреЗрдж рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддрд╛ рд╣реИред рдПрдХ рдиреАрд▓реЗ рд░рдВрдЧ рдХреЗ рд╕рд╛рде рдЙрдЪреНрдЪ рд╡рд┐рдкрд░реАрдд рдЫрд╡рд┐ред

 public function gotham() { $this->tempfile(); $this->execute("convert $this->_tmp -modulate 120,10,100 -fill '#222b6d' -colorize 20 -gamma 0.5 -contrast -contrast $this->_tmp"); $this->border($this->_tmp); $this->output(); } 




рдЯреЛрд╕реНрдЯрд░ рдлрд╝рд┐рд▓реНрдЯрд░

рдкреБрд░рд╛рдиреЗ рдкреЛрд▓реЗрд░реЙрдЗрдб рд╢реЙрдЯреНрд╕ рдХреА рдпрд╛рдж рддрд╛рдЬрд╛ рдХрд░рддреА рд╣реИ, рдЗрд╕рдореЗрдВ рдХреЗрдВрджреНрд░ рд╕реЗ рдЧреБрд▓рд╛рдмреА / рдирд╛рд░рдВрдЧреА рдЪрдордХ рдХреЗ рд╕рд╛рде рдЬреАрд╡рдВрдд рд░рдВрдЧ рд╣реЛрддреЗ рд╣реИрдВред рдЗрдВрд╕реНрдЯрд╛рдЧреНрд░рд╛рдо рдХреЗ рд╕реАрдИрдУ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдпрд╣ рд╕рдмрд╕реЗ рдХрдард┐рди рдкреНрд░рднрд╛рд╡реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред
 public function toaster() { $this->tempfile(); $this->colortone($this->_tmp, '#330000', 100, 0); $this->execute("convert $this->_tmp -modulate 150,80,100 -gamma 1.2 -contrast -contrast $this->_tmp"); $this->vignette($this->_tmp, 'none', 'LavenderBlush3'); $this->vignette($this->_tmp, '#ff9966', 'none'); $this->output(); } 


рддреБрдо рднреА рдкреВрд░реНрдг рдкреНрд░рднрд╛рд╡ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдлреЗрдж рдлреНрд░реЗрдо рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдмрд╕ рдЬреЛрдбрд╝реЗрдВ

 $this->border($this->_tmp, 'white');  $this->output(); 




рдиреИрд╢рд╡рд┐рд▓реЗ рдлрд╝рд┐рд▓реНрдЯрд░

 public function nashville() { $this->tempfile(); $this->colortone($this->_tmp, '#222b6d', 100, 0); $this->colortone($this->_tmp, '#f7daae', 100, 1); $this->execute("convert $this->_tmp -contrast -modulate 100,150,100 -auto-gamma $this->_tmp"); $this->frame($this->_tmp, __FUNCTION__); $this->output(); } 




рд▓реЛрдореЛ рдлрд┐рд▓реНрдЯрд░

 public function lomo() { $this->tempfile(); $command = "convert {$this->_tmp} -channel R -level 33% -channel G -level 33% $this->_tmp"; $this->execute($command); $this->vignette($this->_tmp); $this->output(); } 




рдХреЗрд▓реНрд╡рд┐рди рдлрд╝рд┐рд▓реНрдЯрд░

 public function kelvin() { $this->tempfile(); $this->execute("convert ( $this->_tmp -auto-gamma -modulate 120,50,100 ) ( -size {$this->_width}x{$this->_height} -fill 'rgba(255,153,0,0.5)' -draw 'rectangle 0,0 {$this->_width},{$this->_height}' ) -compose multiply $this->_tmp"); $this->frame($this->_tmp, __FUNCTION__); $this->output(); } 




рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВ?


рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдиреЗ рд╕рднреА рдХреЛрдб рдХреЛ instagraph.php рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕рд╣реЗрдЬ рд▓рд┐рдпрд╛ рд╣реИред рдЕрдм filter.php рдирд╛рдордХ рдПрдХ рдлрд╛рдЗрд▓ рдмрдирд╛рдПрдВ рдФрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдХреЛ рдХреЙрдкреА рдХрд░реЗрдВред

рдпрджрд┐ рдЖрдк рдХреЗрд╡рд▓ рдПрдХ рдлрд╝рд┐рд▓реНрдЯрд░ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЗрд╕реЗ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 require 'instagraph.php'; try { $instagraph = Instagraph::factory('input.jpg', 'output.jpg'); } catch (Exception $e) { echo $e->getMessage(); die; } $instagraph->toaster(); //   


рд╡рд╣ рд╕рдм рд╣реИ! рдпрджрд┐ рдЖрдк рд╕рднреА рдлрд╝рд┐рд▓реНрдЯрд░ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдЗрд╕ рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:

 require 'instagraph.php'; try { $instagraph = Instagraph::factory('input.jpg', 'output.jpg'); } catch (Exception $e) { echo $e->getMessage(); die; } // loop through all filters foreach(array('gotham', 'toaster', 'nashville', 'lomo', 'kelvin') as $method) { $instagraph->_output = $method.'.jpg'; // we have to change output file to prevent overwrite $instagraph->$method(); // apply current filter (from array) } 


рдЙрддреНрдкрд╛рджрдХрддрд╛


рдкреНрд░рджрд░реНрд╢рди, рдЬрд╝рд╛рд╣рд┐рд░ рд╣реИ, рдХрд┐рд╕реА рднреА рдЖрд╡реЗрджрди рдореЗрдВ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣рд┐рд╕реНрд╕рд╛ рд╣реИред рдПрдХ рдЫрд╡рд┐ рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд╝рд┐рд▓реНрдЯрд░ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд▓рдЧрднрдЧ 1 рд╕реЗрдХрдВрдб рд╣реИ, рд╣рдо рд╡рд┐рд╢реНрд╡рд╛рд╕ рдХреЗ рд╕рд╛рде рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдмрд╣реБрдд рддреЗрдЬрд╝ рд╣реИ!

Source: https://habr.com/ru/post/In140704/


All Articles