2012-04-24 4 views
20

Dribbble.comの機能をイメージの主な色を検出して複製しようとしています。下の画像では、Dribbble.comのスクリーンショットを見ることができます。このスクリーンショットでは、画像の8つの主な色が左側に表示されています。ここに画像内の実際のページがありますhttp://dribbble.com/shots/528033-Fresh-Easy?list=followingPHPで画像内の主要な色を検出

私が必要とする色が得られたら、これをデータベースに保存して処理をすべてのページで実行する必要はありません負荷。

画像からこれらの色をどのように取得するかについての研究が行われた後、画像をピクセル単位で調べて、最も多く発生する色を保存するという人もいます。他の人にはそれ以上のことがあり、最も頻繁に存在する色を得ることは望ましい影響を与えないと言います。彼らは画像/色を量子化する必要があると言います(私はこの時点で失われています)。ドリブル下の画像で

は同じことを行いJavaScriptライブラリで以下のショット、そのページは私が見ることができるページのソースを表示するここhttp://lokeshdhakar.com/projects/color-thief/

閲覧することができquantize.jsというJavaScriptファイルがありますし、結果は本当に良いです。だから私は、私は色を返し、PHPで画像にカウントされます。この機能を発見したJavaScriptライブラリがないこと何が、PHPとGD/ImageMagickの

enter image description here


で行うことができるように期待していますしかし、結果はJavascriptのバージョン上記とは異なり、ドリブルが

/** 
* 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-picture –

+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

これはCへのポートの良いカディデートのようです: – quickshiftin

3

リンク先のページにGitHubのソースコードへのリンクがあります。 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色が必要な場合は、約8x8に、6色を約12x8に縮小します。縮小画像用

imagecopyresizedその後、すべてのピクセルをチェックして、私のために完璧な作品

<?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; 

} 
?> 
これを試してみて、アレイ imagecolorat($image,px,py)

に保管してください。 JPEGやPNGとhttp://www.coolphptools.com/color_extract

作品:

+0

これは素晴らしい軽量な色の例です。最高の使用色に制限する方法はありますか?たとえば、画像の上位8色を使用しましたか? – JasonDavis

0

はこれを試してみてください。

アレイ( [3060a8] => 0.55827380952381 [f0a848] => 0.19791666666667:

、作曲と!:いいえハッスル最高、ただのrequire_once

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); 

はあなたにこのような何かを与えます => 0.069642857142857 [483018] => 0.02047619047619 [786018] => 0.01827380952381 [183060] => 0.01797619047619 [4878a8] => 0.016011904761905 [181800] => 0.015119047619048 [a87830] => 0.014345238095238 [a8c0d8] => 0.011904761904762 [6090c0] => 0.01172619047619 [d89030] => 0.011011904761905 [90a8d8] => 0.0071428571428571 [FFFFFF] => 0.0070238095238095 [604830] => 0.006547619047619 [f0f0f0] => 0.0063095238095238 [d8d8f0] => 0.005297619047619 [c0d8d8] => 0.0044047619047619 [f0f0ff] => 0.00041666666666667 [181830] => 0.00011904761904762)

違う画像で試してみましたが、信頼できると思います。

関連する問題