2012-04-24 7 views
20

के साथ एक छवि में मुख्य रंग का पता लगाने मुझे लगता है कि Dribbble.com एक छवि में प्रमुख रंग का पता लगाने के साथ करता है कार्यक्षमता को दोहराने के लिए कोशिश कर रहा हूँ। नीचे दी गई छवि में आप Dribbble.com से एक स्क्रीनशॉट देख सकते हैं जो छवि में 8 मुख्य रंग बाईं ओर दिखाता है। छवि http://dribbble.com/shots/528033-Fresh-Easy?list=followingपीएचपी

मुझे PHP में ऐसा करने में सक्षम होने की आवश्यकता है, मुझे रंगों की आवश्यकता होने के बाद मैं उन्हें डेटाबेस में सहेज दूंगा ताकि प्रोसेसिंग को प्रत्येक पृष्ठ पर चलाने की आवश्यकता न हो भार।

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

चूना शॉट नीचे एक जावास्क्रिप्ट पुस्तकालय है कि एक ही बात करता है, उस पृष्ठ को यहाँ http://lokeshdhakar.com/projects/color-thief/

देखी जा सकती है जाता है कि पेज मैं देख सकता है एक जावास्क्रिप्ट quantize.js नाम की फ़ाइल के स्रोत देखने नीचे दी गई छवि में और परिणाम वास्तव में अच्छे हैं। तो मैं क्या है कि जावास्क्रिप्ट पुस्तकालय करती है, लेकिन ऐसा करने के लिए PHP के साथ सक्षम होने के लिए उम्मीद कर रहा हूँ और जी.डी./ImageMagick

enter image description here


मैं इस समारोह है कि PHP के साथ रंग लौट सकते हैं और एक छवि में ही गिना जाएगा मिल गया था लेकिन परिणामों के ऊपर जावास्क्रिप्ट संस्करण से अलग कर रहे हैं और ड्रिबल परिणाम

/** 
* Returns the colors of the image in an array, ordered in descending order, where the keys are the colors, and the values are the count of the color. 
* 
* @return array 
*/ 
function Get_Color() 
{ 
    if (isset($this->image)) 
    { 
     $PREVIEW_WIDTH = 150; //WE HAVE TO RESIZE THE IMAGE, BECAUSE WE ONLY NEED THE MOST SIGNIFICANT COLORS. 
     $PREVIEW_HEIGHT = 150; 
     $size = GetImageSize($this->image); 
     $scale=1; 
     if ($size[0]>0) 
     $scale = min($PREVIEW_WIDTH/$size[0], $PREVIEW_HEIGHT/$size[1]); 
     if ($scale < 1) 
     { 
      $width = floor($scale*$size[0]); 
      $height = floor($scale*$size[1]); 
     } 
     else 
     { 
      $width = $size[0]; 
      $height = $size[1]; 
     } 
     $image_resized = imagecreatetruecolor($width, $height); 
     if ($size[2]==1) 
     $image_orig=imagecreatefromgif($this->image); 
     if ($size[2]==2) 
     $image_orig=imagecreatefromjpeg($this->image); 
     if ($size[2]==3) 
     $image_orig=imagecreatefrompng($this->image); 
     imagecopyresampled($image_resized, $image_orig, 0, 0, 0, 0, $width, $height, $size[0], $size[1]); //WE NEED NEAREST NEIGHBOR RESIZING, BECAUSE IT DOESN'T ALTER THE COLORS 
     $im = $image_resized; 
     $imgWidth = imagesx($im); 
     $imgHeight = imagesy($im); 
     for ($y=0; $y < $imgHeight; $y++) 
     { 
      for ($x=0; $x < $imgWidth; $x++) 
      { 
       $index = imagecolorat($im,$x,$y); 
       $Colors = imagecolorsforindex($im,$index); 
       $Colors['red']=intval((($Colors['red'])+15)/32)*32; //ROUND THE COLORS, TO REDUCE THE NUMBER OF COLORS, SO THE WON'T BE ANY NEARLY DUPLICATE COLORS! 
       $Colors['green']=intval((($Colors['green'])+15)/32)*32; 
       $Colors['blue']=intval((($Colors['blue'])+15)/32)*32; 
       if ($Colors['red']>=256) 
       $Colors['red']=240; 
       if ($Colors['green']>=256) 
       $Colors['green']=240; 
       if ($Colors['blue']>=256) 
       $Colors['blue']=240; 
       $hexarray[]=substr("0".dechex($Colors['red']),-2).substr("0".dechex($Colors['green']),-2).substr("0".dechex($Colors['blue']),-2); 
      } 
     } 
     $hexarray=array_count_values($hexarray); 
     natsort($hexarray); 
     $hexarray=array_reverse($hexarray,true); 
     return $hexarray; 

    } 
    else die("You must enter a filename! (\$image parameter)"); 
} 

तो मैं किसी को भी जानता है कि कैसे मैं PHP के साथ इस तरह के एक काम कर सकते हैं पूछ रहा हूँ? संभवत: कुछ ऐसा पहले से मौजूद है जो आपको पता करने के लिए एक कदम रखने के बारे में जानता है या किसी भी सुझाव की सराहना की जाएगी

+0

http://stackoverflow.com/questions/3468500/detect-overall-Average-color-of-the- चित्र –

+0

@aSeptik ऐसा लगता है कि मैंने पहले ही पोस्ट किया है कोड – JasonDavis

+0

क्या आपने कोशिश की है 'php' के लिए Google को खोजने के लिए छवि से रंग पैलेट प्राप्त करें "मैंने कई परिणामों की स्थापना की; बस पूछ रहा है ... –

उत्तर

24

यहाँ वास्तव में क्या आप PHP में देख रहे है: https://github.com/thephpleague/color-extractor

उदाहरण:

require 'vendor/autoload.php'; 

use League\ColorExtractor\Client as ColorExtractor; 

$client = new ColorExtractor; 

$image = $client->loadPng('./some/image.png'); 

// Get the most used color hexadecimal codes from image.png 
$palette = $image->extract(); 
+0

यह सी के लिए बंदरगाह के लिए एक अच्छा कैडिडेट जैसा दिखता है :) – quickshiftin

3

आपके द्वारा लिंक किया गया पृष्ठ गिटहब पर स्रोत कोड का एक लिंक है, इसलिए यदि आप जानना चाहते हैं कि वे कैसे कर रहे हैं आप PHP में अपने स्रोत दोहराना कर सकते हैं।

वे इसे कैसे कर रहे हैं और कैसे कर रहे हैं आप, यह क्या कर रहे हैं के बीच बड़ा अंतर यह है कि वे क्लस्टरिंग का उपयोग कर रहे रंग मिल रहा है। जब वे इसे स्टोर करते हैं तो रंग को गोल करने के बजाय, वे एक सरणी में सभी कच्चे रंगों को संग्रहित कर रहे हैं। तब वे इस सरणी के माध्यम से लूप जब तक वे एक क्लस्टर क्लस्टर में रंगों की संख्या के लिए क्लस्टर में अंक के उच्चतम अनुपात है पाते हैं। इसका केंद्र बिंदु सबसे आम रंग है। पैलेट तो समूहों के पास पूरा ओवरलैप को रोकने के लिए कुछ तर्क के साथ, समूहों के अगले सर्वोच्च सेट द्वारा परिभाषित किया गया है।

5

यह मेरा सरल एक छवि के मुख्य रंग प्राप्त करने के लिए विधि है

<?php 

    $image=imagecreatefromjpeg('image.jpg'); 
    $thumb=imagecreatetruecolor(1,1); imagecopyresampled($thumb,$image,0,0,0,0,1,1,imagesx($image),imagesy($image)); 
    $mainColor=strtoupper(dechex(imagecolorat($thumb,0,0))); 
    echo $mainColor; 

?> 
5

आप तस्वीर को स्केल करने की आवश्यकता है और आपको तस्वीर के मुख्य रंग मिलेंगे। आप चटाई में 4 रंग की जरूरत है, यह 12x8 के बारे में और इतने पर करने के लिए 8x8 के बारे में, 6 रंग करने के लिए नीचे पैमाने पर ...

imagecopyresized छोटा छवि के लिए तो हर पिक्सल जांच करने और उन्हें सरणी imagecolorat($image,px,py)

में स्टोर

<?php 

// EXAMPLE PICTURE 
$url='https://www.nordoff-robbins.org.uk/sites/default/files/google.jpg'; 

//var_dump(getColorPallet($url)); 

echoColors(getColorPallet($url)); 


function echoColors($pallet){ // OUTPUT COLORSBAR 
    foreach ($pallet as $key=>$val) 
     echo '<div style="display:inline-block;width:50px;height:20px;background:#'.$val.'"> </div>'; 
} 

function getColorPallet($imageURL, $palletSize=[16,8]){ // GET PALLET FROM IMAGE PLAY WITH INPUT PALLET SIZE 
    // SIMPLE CHECK INPUT VALUES 
    if(!$imageURL) return false; 

    // IN THIS EXEMPLE WE CREATE PALLET FROM JPG IMAGE 
    $img = imagecreatefromjpeg($imageURL); 

    // SCALE DOWN IMAGE 
    $imgSizes=getimagesize($imageURL); 

    $resizedImg=imagecreatetruecolor($palletSize[0],$palletSize[1]); 

    imagecopyresized($resizedImg, $img , 0, 0 , 0, 0, $palletSize[0], $palletSize[1], $imgSizes[0], $imgSizes[1]); 

    imagedestroy($img); 

    //CHECK IMAGE 
    /*header("Content-type: image/png"); 
    imagepng($resizedImg); 
    die();*/ 

    //GET COLORS IN ARRAY 
    $colors=[]; 

    for($i=0;$i<$palletSize[1];$i++) 
     for($j=0;$j<$palletSize[0];$j++) 
      $colors[]=dechex(imagecolorat($resizedImg,$j,$i)); 

    imagedestroy($resizedImg); 

    //REMOVE DUPLICATES 
    $colors= array_unique($colors); 

    return $colors; 

} 
?> 

मेरे लिए एकदम सही काम करता है इस बाहर की कोशिश करो।

+0

यह एक अच्छा है रंग प्राप्त करने का हल्का उदाहरण। शीर्ष उपयोग किए गए रंगों तक सीमित करने का कोई तरीका है। उदाहरण के लिए एक छवि में शीर्ष 8 इस्तेमाल रंग? – JasonDavis

0

इस प्रयास करें: जेपीईजी और PNG के साथ http://www.coolphptools.com/color_extract

काम करता है।

और सबसे अच्छी !: संगीतकार के साथ कोई ऊधम, बस

require_once 'colorextract/colors.inc.php'; 
$ex=new GetMostCommonColors(); 
$num_results=20; 
$reduce_brightness=1; 
$reduce_gradients=1; 
$delta=24; 
$colors=$ex->Get_Color('image.png', $num_results, $reduce_brightness, $reduce_gradients, $delta); 
print_r($colors); 

require_once आप कुछ इस तरह दे:

सरणी ( [3060a8] => .55827380952381 [f0a848] => .19791666666667 [000000] => 0.069642857142857 [483018] => 0.02047619047619 [786018] => 0.01827380952381 [183060] => 0.01797619047619 [4878a8] => .016011904761905 [181,800] => .015119047619048 [a87830] => .014345238095238 [a8c0d8] => .011904761904762 [6090c0] => .01172619047619 [d89030] => .011011904761905 [90a8d8] => .0071428571428571 [FFFFFF] => .0070238095238095 [604,830] => .006547619047619 [f0f0f0] => .0063095238095238 [d8d8f0] => .005297619047619 [c0d8d8] => .0044047619047619 [f0f0ff] => .00041666666666667 [181,830] => .00011904761904762)

मैंने इसे विभिन्न छवियों के साथ करने की कोशिश की और यह विश्वसनीय लगता है।