2012-12-03 66 views
4
圖像的邊框顏色

我試圖找到一種方法,使用php算法找到PHP

我曾嘗試使用此代碼從圖像的邊框顏色,但是這algorathim讓我在所有的顏色任何圖像。

<?php 
function colorPalette($imageFile, $numColors, $granularity = 5) 
{ 
    $granularity = max(1, abs((int)$granularity)); 
    $colors = array(); 
    $size = @getimagesize($imageFile); 
    if($size === false) 
    { 
     user_error("Unable to get image size data"); 
     return false; 
    } 
    $img = @imagecreatefromjpeg($imageFile); 
    if(!$img) 
    { 
     user_error("Unable to open image file"); 
     return false; 
    } 
    for($x = 0; $x < $size[0]; $x += $granularity) 
    { 
     for($y = 0; $y < $size[1]; $y += $granularity) 
     { 
     $thisColor = imagecolorat($img, $x, $y); 
     $rgb = imagecolorsforindex($img, $thisColor); 
     $red = round(round(($rgb['red']/0x33)) * 0x33); 
     $green = round(round(($rgb['green']/0x33)) * 0x33); 
     $blue = round(round(($rgb['blue']/0x33)) * 0x33); 
     $thisRGB = sprintf('%02X%02X%02X', $red, $green, $blue); 
     if(array_key_exists($thisRGB, $colors)) 
     { 
      $colors[$thisRGB]++; 
     } 
     else 
     { 
      $colors[$thisRGB] = 1; 
     } 
     } 
    } 
    arsort($colors); 
    return array_slice(array_keys($colors), 0, $numColors); 
} 
// sample usage: 
$palette = colorPalette('rmnp8.jpg', 10, 4); 
echo "<table>\n"; 
foreach($palette as $color) 
{ 
    echo "<tr><td style='background-color:#$color;width:2em;'>&nbsp;</td><td>#$color</td></tr>\n"; 
} 
echo "</table>\n"; 

此外,我正在嘗試使用它來構建像這些設計一樣的設計。

first second

+0

按理說,你基本上切片幾個像素從網格中的圖像中提取出來,並試圖計算它們發生的頻率。考慮一個彩虹漸變的圖像 - 您可能會在每個測試點獲得獨特的顏色。您必須減少粒度(例如,減少更多采樣)或使用其他方法。 –

回答

4

你得到所有顏色的圖像中的原因是因爲您使用的是嵌套循環遍歷圖像中的像素。相反,你應該使用兩個連續的循環:一個檢查水平邊界和其他檢查垂直的,所以你的循環代碼會變成這樣的事情:

function checkColorAt(&$img, $x, $y, &$colors) { 
    $thisColor = imagecolorat($img, $x, $y); 
    $rgb = imagecolorsforindex($img, $thisColor); 
    $red = round(round(($rgb['red']/0x33)) * 0x33); 
    $green = round(round(($rgb['green']/0x33)) * 0x33); 
    $blue = round(round(($rgb['blue']/0x33)) * 0x33); 
    $thisRGB = sprintf('%02X%02X%02X', $red, $green, $blue); 
    if(array_key_exists($thisRGB, $colors)) 
    { 
     $colors[$thisRGB]++; 
    } 
    else 
    { 
     $colors[$thisRGB] = 1; 
    } 
} 


$colors = array(); 
for($x = 0; $x < $size[0]; $x += $granularity) 
{ 
    checkColorAt(&$img, $x, $0, &$colors); 
    checkColorAt(&$img, $x, $size[1] - 1, &$colors); 
} 

for($y = 0; $y < $size[1]; $y += $granularity) 
{ 
    checkColorAt(&$img, $0, $y, &$colors); 
    checkColorAt(&$img, $size[0] - 1, $y, &$colors); 
} 
+0

我完全不理解你,如果$ thisRGB總是空的,我如何使用你的代碼? – Othman

+0

@奧斯曼哈!好趕上,我混淆了變量名稱。數組名稱應該是'$ colors'。我現在糾正了代碼。 –