2013-03-21 5 views
5

के साथ फ़िल्टर गुणा करें मैंने फ़ोटोशॉप के मल्टीप्ली प्रभाव को अनुकरण करने के लिए जीडी लाइब्रेरी के साथ प्रयोग करने का प्रयास किया है, लेकिन मुझे अभी तक एक समाधान समाधान नहीं मिला है।PHP की जीडी लाइब्रेरी

Wikipedia के अनुसार

, गुणा मिश्रण मोड:

[...] नीचे की परत के लिए इसी पिक्सेल के साथ शीर्ष स्तर के प्रत्येक पिक्सेल के लिए संख्या गुणा। नतीजा एक गहरा चित्र है।

क्या किसी को PHP का उपयोग करके इसे प्राप्त करने का कोई तरीका पता है? कोई भी सहायताकाफी प्रशंसनीय होगी।

उत्तर

13

आप अपनी छवि के हर पिक्सेल, तो लेने के अपने पृष्ठभूमि रंग/255 (यह फ़ोटोशॉप सूत्र दिया गया है) के साथ प्रत्येक आरजीबी मूल्य गुणा करने की आवश्यकता। उदाहरण के लिए, एक लाल रंग की पृष्ठभूमि रंग गुणा फिल्टर के साथ एक JPG फ़ाइल, बेहतर परिणाम के लिए एक PNG फ़ाइल के रूप में सहेजा:

<?php 
$filter_r=216; 
$filter_g=0; 
$filter_b=26; 
$suffixe="_red"; 
$path=YOURPATHFILE; 

if(is_file($path)){ 
    [email protected]($path); 
    $new_path=substr($path,0,strlen($path)-4).$suffixe.".png"; 

    $imagex = imagesx($image); 
    $imagey = imagesy($image); 
    for ($x = 0; $x <$imagex; ++$x) { 
     for ($y = 0; $y <$imagey; ++$y) { 
      $rgb = imagecolorat($image, $x, $y); 
      $TabColors=imagecolorsforindex ($image , $rgb); 
      $color_r=floor($TabColors['red']*$filter_r/255); 
      $color_g=floor($TabColors['green']*$filter_g/255); 
      $color_b=floor($TabColors['blue']*$filter_b/255); 
      $newcol = imagecolorallocate($image, $color_r,$color_g,$color_b); 
      imagesetpixel($image, $x, $y, $newcol); 
     } 
    } 

    imagepng($image,$new_path); 
} 
?> 
+0

बढ़िया, बहुत बहुत धन्यवाद! ऐसा लगता है कि फ़ोटोशॉप के गुणा फ़िल्टर के रूप में सटीक funcionality प्रदान करते हैं। – heintore

+0

मैंने इसे किसी अन्य उदाहरण में उपयोग किया, लेकिन मुझे यह कार्यान्वयन वास्तव में धीमा पाया। IMG_FILTER_COLORIZE के साथ imagefilter का उपयोग करने का तेज़ तरीका होगा। सबसे पहले, इच्छित रंग आरजीबी मान को घुमाएं, फिर छविफिल्टर ($ छवि, IMG_FILTER_NEGATE) के साथ छवि को घुमाएं, फिर उल्टा चित्र को उलटा छवि पर लागू करें, फिर छवि को फिर से घुमाएं। यहां देखें http://stackoverflow.com/questions/26005991/php-gd-multiply-image-colors-with-tint-color/26250684#26250684 –

+0

बढ़िया काम करता है! मैंने इसे दो छवियों को गुणा करने के लिए थोड़ा अपडेट किया, न केवल रंग के साथ एक छवि: http://codepad.org/BSawY5ex –

0

क्या आपने php manual का उपयोग करने का प्रयास किया है?

(आम तौर पर ख & डब्ल्यू वाले) में फ़ोटोशॉप की तरह छवियों पर एक 'गुणा' प्रभाव लागू करने के लिए देख लोगों के लिए, आप IMG_FILTER_COLORIZE फिल्टर के साथ इसे प्राप्त कर सकते हैं।

<?php 
function multiplyColor(&$im, $color = array(255, 0, 0)) { 
    //get opposite color 
    $opposite = array(255 - $color[0], 255 - $color[1], 255 - $color[2]); 

    //now we subtract the opposite color from the image 
    imagefilter($im, IMG_FILTER_COLORIZE, -$opposite[0], -$opposite[1], -$opposite[2]); 
} 
?> 
+0

मैंने उस समारोह को लागू करने की कोशिश की, लेकिन मी वाई परीक्षण से पता चला है कि यह फ़ोटोशॉप के गुणा फ़िल्टर के समान परिणाम नहीं उत्पन्न करता है। इसके विपरीत गुणा करने के लिए पृष्ठभूमि रंग प्रदान करना स्वाभाविक प्रतीत होता है, न केवल विपरीत रंगों को प्रतिस्थापित करता है। – heintore

+0

पीछे की अवधारणा बिल्कुल फ़ोटोशॉप के उत्पादन में उपयोगी थी। मैंने इसका परीक्षण किया और छवियां समान हैं। –

5

मैं भी दो छवियों के बीच गुणा मिश्रण तलाश रहे हैं और किसी भी देशी नहीं पा सके इसके लिए -पीपी समाधान। ऐसा प्रतीत होता है कि केवल एकमात्र तरीका (अभी के लिए) "पिक्सेल-बाय-पिक्सेल" मैन्युअल रूप से सेट करना है। यहां मेरा कोड है जो दो छवियों के बीच गुणा मिश्रण करता है, यह मानते हुए कि छवियां एक ही आकार के हैं। यदि आप चाहें तो विभिन्न आकारों को संभालने के लिए आप इसे समायोजित कर सकते हैं।

function multiplyImage($dst,$src) 
{ 
    $ow = imagesx($dst); 
    $oh = imagesy($dst); 

    $inv255 = 1.0/255.0; 

    $c = imagecreatetruecolor($ow,$oh); 
    for ($x = 0; $x <$ow; ++$x) 
    { 
     for ($y = 0; $y <$oh; ++$y) 
     { 
      $rgb_src = imagecolorsforindex($src,imagecolorat($src, $x, $y)); 
      $rgb_dst = imagecolorsforindex($dst,imagecolorat($dst, $x, $y)); 
      $r = $rgb_src['red'] * $rgb_dst['red']*$inv255; 
      $g = $rgb_src['green'] * $rgb_dst['green']*$inv255; 
      $b = $rgb_src['blue'] * $rgb_dst['blue']*$inv255; 
      $rgb = imagecolorallocate($c,$r,$g,$b); 
      imagesetpixel($c, $x, $y, $rgb); 
     } 
    } 
    return $c; 
} 

फ़ंक्शन छवि ऑब्जेक्ट देता है ताकि आपको इसका उपयोग करने के बाद imagedestroy करना सुनिश्चित करना चाहिए।

ओवरले देशी-php मिश्रण का उपयोग करके एक कामकाज होना चाहिए, जो बताता है कि गंतव्य छवि का 50% ग्रे पिक्सेल स्रोत पिक्सल से प्रभावित होगा। सिद्धांत रूप में, यदि आपको दो काले और सफेद छवियों (कोई ग्रे टोन) मिश्रण करने की आवश्यकता नहीं है, तो यदि आप गंतव्य छवि के विपरीत सेट करते हैं तो सफेद 50% -ग्रे बन जाएगा, और उसके बाद ओवरले-मिश्रण स्रोत छवि को देना चाहिए, आप गुणा करने के समान कुछ। लेकिन रंगीन छवियों, या ग्रेस्केल छवियों के लिए, यह काम नहीं करेगा - उपरोक्त विधि एकमात्र विकल्प प्रतीत होता है।

2

मुझे इस धागे में ले जाया गया जब मुझे जीडी में दो छवियों को मिश्रित करने की आवश्यकता थी। ऐसा लगता है कि इसके लिए विशेष रूप से कोई कोड नहीं है इसलिए मैं इसे यहां इस पृष्ठ पर भविष्य के आगंतुकों के लिए छोड़ दूंगा।

यह colivier के उत्तर से एक कांटा है जो दो छवियों के गुणा-मिश्रण का समर्थन करता है।

दो छवियों को एक ही आकार की आवश्यकता नहीं है लेकिन ओवरलेइंग छवि का आकार बदल दिया जाएगा और नीचे परत के आकार में फसल की जाएगी। मैंने ऐसा करने के लिए fit सहायक फ़ंक्शन बनाया लेकिन इसके साथ परेशान न करें।

imagecolorat पारदर्शीता वाले पीएनजी के साथ भी मूल रंग देता है। यही है, एक 50% काला (128 (128, 128, 128) के रूप में दिखाई देता है) को अल्फा मान होने के रूप में (0, 0, 0, 64) 64 के रूप में वापस कर दिया जाएगा। यह कोड पारदर्शिता को ध्यान में रखता है और पारदर्शी रंगों को दृश्य रंग मानों में परिवर्तित करता है।

// bottom layer 
$img1 = imagecreatefromjpeg(realpath(__DIR__.'/profilePic.jpg')); 

// top layer 
$img2 = imagecreatefrompng(realpath(__DIR__.'/border2.png')); 
imagealphablending($img2, false); 
imagesavealpha($img2, true); 

$imagex = imagesx($img1); 
$imagey = imagesy($img1); 

$imagex2 = imagesx($img2); 
$imagey2 = imagesy($img2); 

// Prereq: Resize img2 to match img1, cropping beyond the aspect ratio 
$w1 = max(min($imagex2, $imagex), $imagex); 
$h1 = max(min($imagey2, $imagey), $imagey); 

$w_using_h1 = round($h1 * $imagex2/$imagey2); 
$h_using_w1 = round($w1 * $imagey2/$imagex2); 

if ($w_using_h1 > $imagex) { 
    fit($img2, $imagex, $imagey, 'HEIGHT', true); 
} 
fit($img2, $imagex, $imagey, 'WIDTH', true); 

// Actual multiply filter 
for ($x = 0; $x < $imagex; ++$x) { 
    for ($y = 0; $y < $imagey; ++$y) { 
     $rgb1 = imagecolorat($img1, $x, $y); 
     $rgb2 = imagecolorat($img2, $x, $y); 
     $idx1 = imagecolorsforindex($img1, $rgb1); 
     $idx2 = imagecolorsforindex($img2, $rgb2); 

     // Shift left 8, then shift right 7 
     // same as multiply by 256 then divide by 128 
     // approximate multiply by 255 then divide by 127 
     // This is basically multiply by 2 but, expanded to show that 
     // we are adding a fraction of white to the translucent image 
     // $adder = ($idx2['alpha'] <<8>> 7); 
     $adder = ($idx2['alpha'] << 1); 
     $rmul = min(255, $idx2['red'] + $adder); 
     $gmul = min(255, $idx2['green'] + $adder); 
     $bmul = min(255, $idx2['blue'] + $adder); 

     $color_r = floor($idx1['red'] * $rmul/255); 
     $color_g = floor($idx1['green'] * $gmul/255); 
     $color_b = floor($idx1['blue'] * $bmul/255); 

     $newcol = imagecolorallocatealpha($img1, $color_r, $color_g, $color_b, 0); 
     imagesetpixel($img1, $x, $y, $newcol); 
    } 
} 
imagejpeg($img1, __DIR__.'/out.jpg'); 



/** 
* Fits an image to a $w x $h canvas 
* 
* @param type $w Target width 
* @param type $h Target height 
* @param int $fit_which Which dimension to fit 
* @param bool $upscale If set to true, will scale a smaller image to fit the given dimensions 
* @param bool $padded If set to true, will add padding to achieve given dimensions 
* 
* @return Image object 
*/ 
function fit(&$img, $w, $h, $fit_which = 'BOTH', $upscale = false, $padded = true) { 

    if (!in_array($fit_which, array('WIDTH', 'HEIGHT', 'BOTH'))) { 
     $fit_which = 'BOTH'; 
    } 
    $w0 = imagesx($img); 
    $h0 = imagesy($img); 

    if (!$upscale && $w0 <= $w && $h0 <= $h) 
     return $this; 

    if ($padded) { 
     $w1 = max(min($w0, $w), $w); 
     $h1 = max(min($h0, $h), $h); 
    } 
    else { 
     $w1 = min($w0, $w); 
     $h1 = min($h0, $h); 
    } 
    $w_using_h1 = round($h1 * $w0/$h0); 
    $h_using_w1 = round($w1 * $h0/$w0); 

    // Assume width, crop height 
    if ($fit_which == 'WIDTH') { 
     $w2 = $w1; 
     $h2 = $h_using_w1; 
    } 
    // Assume height, crop width 
    elseif ($fit_which == 'HEIGHT') { 
     $w2 = $w_using_h1; 
     $h2 = $h1; 
    } 
    elseif ($fit_which == 'BOTH') { 
     if (!$padded) { 
      $w2 = $w = min($w, $w_using_h1); 
      $h2 = $h = min($h, $h_using_w1); 
     } 
     else { 
      // Extend vertically 
      if ($h_using_w1 <= $h) { 
       $w2 = $w1; 
       $h2 = $h_using_w1; 
      } 
      // Extend horizontally 
      else { 
       $w2 = $w_using_h1; 
       $h2 = $h1; 
      } 
     } 
    } 

    $im2 = imagecreatetruecolor($w, $h); 
    imagealphablending($im2, true); 
    imagesavealpha($im2, true); 

    $transparent = imagecolorallocatealpha($im2, 255, 255, 255, 127); 
    imagefill($im2, 0, 0, $transparent); 

    imagealphablending($img, true); 
    imagesavealpha($img, true); 
    // imagefill($im, 0, 0, $transparent); 

    imagecopyresampled($im2, $img, ($w - $w2)/2, ($h - $h2)/2, 0, 0, $w2, $h2, $w0, $h0); 

    $img = $im2;  
} 
0

png छवि और अल्फा के साथ इस्तेमाल किया अच्छी तरह से होना चाहिए और बहुत अच्छी तरह से काम करता है

$filter_r=215; 
 
    $filter_g=5; 
 
    $filter_b=5; 
 
    $alpha=70; 
 
    $suffixe="_red"; 
 
    $path="./img/foto_220_590.png"; 
 
    if(is_file($path)){ 
 
     $image=imagecreatefrompng($path); 
 
     $new_path=substr($path,0,strlen($path)-4).$suffixe.".png"; 
 

 
     echo $imagex = imagesx($image); 
 
     echo $imagey = imagesy($image); 
 
     for ($x = 0; $x <$imagex; ++$x) { 
 
      for ($y = 0; $y <$imagey; ++$y) { 
 
       $rgb = imagecolorat($image, $x, $y); 
 
       $TabColors=imagecolorsforindex ($image , $rgb); 
 
       $color_r=floor($TabColors['red']*$filter_r/255); 
 
       $color_g=floor($TabColors['green']*$filter_g/255); 
 
       $color_b=floor($TabColors['blue']*$filter_b/255); 
 
       //$newcol = imagecolorallocate($image, $color_r,$color_g,$color_b); 
 
       // this new alpha 
 
       $newcol = imagecolorallocatealpha($image, $color_r,$color_g,$color_b,$alpha); 
 
       imagesetpixel($image, $x, $y, $newcol); 
 
      } 
 
     } 
 
     imagepng($image,$new_path);

0

मैं अद्यतन @colivier स्क्रिप्ट न सिर्फ दो छवियों myltiply करने में सक्षम हो, और यदि एक रंग के साथ एक छवि:

/** 
* Multiply $pathToDst and $pathToSrc to $resultPath 
* 
* @param string $pathToDst 
* @param string $pathToSrc 
* @param string $resultPath 
*/ 
function multiply($pathToDst, $pathToSrc, $resultPath) { 
    switch (pathinfo($pathToDst, PATHINFO_EXTENSION)) { 
     case "gif" : 
      $resourceDst = imagecreatefromgif($pathToDst); 
      break; 
     case "png" : 
      $resourceDst = imagecreatefrompng($pathToDst); 
      break; 
     default : 
      $resourceDst = imagecreatefromjpeg($pathToDst); 
      break; 
    } 

    switch (pathinfo($pathToSrc, PATHINFO_EXTENSION)) { 
     case "gif" : 
      $resourceSrc = imagecreatefromgif($pathToSrc); 
      break; 
     case "png" : 
      $resourceSrc = imagecreatefrompng($pathToSrc); 
      break; 
     default : 
      $resourceSrc = imagecreatefromjpeg($pathToSrc); 
      break; 
    } 

    for ($x = 0; $x < 400; ++$x) { 
     for ($y = 0; $y < 400; ++$y) { 
      $TabColorsFlag = imagecolorsforindex($resourceDst, imagecolorat($resourceDst, $x, $y)); 
      $TabColorsPerso = imagecolorsforindex($resourceSrc, imagecolorat($resourceSrc, $x, $y)); 

      $color_r = floor($TabColorsFlag['red'] * $TabColorsPerso['red']/255); 
      $color_g = floor($TabColorsFlag['green'] * $TabColorsPerso['green']/255); 
      $color_b = floor($TabColorsFlag['blue'] * $TabColorsPerso['blue']/255); 
      imagesetpixel($resourceDst, $x, $y, imagecolorallocate($resourceSrc, $color_r, $color_g, $color_b)); 
     } 
    } 

    imagepng($resourceDst, $resultPath, 0); 
    imagedestroy($resourceDst); 
    imagedestroy($resourceSrc); 
} 
संबंधित मुद्दे