Detect main colors in an image with PHP

前端 未结 7 2045
走了就别回头了
走了就别回头了 2020-11-27 12:05

I am trying to replicate the functionality that Dribbble.com does with detecting the predominant colors in an Image. In the image below you can see a screenshot from Dribbb

相关标签:
7条回答
  • 2020-11-27 12:16

    Here's exactly what you're looking for in PHP: https://github.com/thephpleague/color-extractor

    Example :

    use League\ColorExtractor\Palette;
    
    $palette = Palette::fromFilename('some/image.png');
    
    $topEightColors = $palette->getMostUsedColors(8);
    
    0 讨论(0)
  • 2020-11-27 12:17

    This is my simple method to get the main color of an image

    $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;
    
    0 讨论(0)
  • 2020-11-27 12:18

    Try this: http://www.coolphptools.com/color_extract

    Works with JPEG and PNG.

    And best!: no hustle with composer, just 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);
    

    give you something like this:

    Array ( [3060a8] => 0.55827380952381 [f0a848] => 0.19791666666667 [000000] => 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 )

    I tried it with different images and it seems reliable.

    0 讨论(0)
  • 2020-11-27 12:19

    You need to scale down the picture and you will get the main colors of the picture. If you need 4 colors in the pallet, scale it down to about 8x8, 6 colors to about 12x8 and so on...

    imagecopyresized for scaled down image then check every pixels and store them in array imagecolorat($image,px,py)

    Try this out

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

    Works perfect for me.

    0 讨论(0)
  • 2020-11-27 12:21

    I have a Unix bash shell script with ImageMagick called dominantcolor that may do what you want. See my scripts web site at http://www.fmwconcepts.com/imagemagick/index.php. You an run it from PHP exec(). See my pointers for use on my home page.

    Input:

    dominantcolor -n 6 -p all -s save plate.png
    
    count,hexcolor
    586,#5ECADC
    520,#AFA85D
    469,#3C3126
    462,#B9C8BB
    258,#488A70
    205,#B06928
    


    The -n 6 is the desired number of colors in the color quantization. The -p all means print all counts and colors for the resulting 6 colors. The -s save indictates to save a swatch image.

    Colors below are shown with the dominant color on the left and decreasing count colors towards the right according to the list above.

    0 讨论(0)
  • 2020-11-27 12:27

    The idea of getting the predominant colors of the image is a bit tricky, because for example the most frequent pixel color could be so widely scattered in the image that it is not perceived as a predominant color at all.

    I think an algorithm like Color coherence vector will be good enough to overcome this issue, because it clusters the colors into coherent and incoherent (which is quite intuitive), and then you can use them to discard those false positive predominant colors.

    I see it is an easy algorithm to implement, this tutorial Image Retrieval: Color Coherence Vector describes describes its steps with examples of how it works and there is even a matlab implementation mentioned at the end of it.

    0 讨论(0)
提交回复
热议问题