PHP image color analysis with transparency

I am currently working on an application that needs to analyse a number of images and figure out what color they're closest to.

Therefore I found a code snippet that does exactly that:

  function analyzeImageColors($im, $xCount =3, $yCount =3)
    //get dimensions for image
    $imWidth =imagesx($im);
    $imHeight =imagesy($im);
    //find out the dimensions of the blocks we're going to make
    $blockWidth =round($imWidth/$xCount);
    $blockHeight =round($imHeight/$yCount);
    //now get the image colors...
    for($x =0; $x<$xCount; $x++) { //cycle through the x-axis
      for ($y =0; $y<$yCount; $y++) { //cycle through the y-axis
        //this is the start x and y points to make the block from
        $blockStartX =($x*$blockWidth);
        $blockStartY =($y*$blockHeight);
        //create the image we'll use for the block
        $block =imagecreatetruecolor(1, 1);
        //We'll put the section of the image we want to get a color for into the block
        imagecopyresampled($block, $im, 0, 0, $blockStartX, $blockStartY, 1, 1, $blockWidth, $blockHeight );
        //the palette is where I'll get my color from for this block
        imagetruecolortopalette($block, true, 1);
        //I create a variable called eyeDropper to get the color information
        $eyeDropper =imagecolorat($block, 0, 0);
        $palette =imagecolorsforindex($block, $eyeDropper);
        $colorArray[$x][$y]['r'] =$palette['red'];
        $colorArray[$x][$y]['g'] =$palette['green'];
        $colorArray[$x][$y]['b'] =$palette['blue'];
        //get the rgb value too
        $hex =sprintf("%02X%02X%02X", $colorArray[$x][$y]['r'], $colorArray[$x][$y]['g'], $colorArray[$x][$y]['b']);
        $colorArray[$x][$y]['rgbHex'] =$hex;
        //destroy the block
    //destroy the source image
    return $colorArray;

Problem is that whenever I provide an image with transparency, GDLib consinders the transparency to be black, thus producing a wrong (much darker) output than is really the case.

For example this icon where the white area around the arrow is actually transparent:

Can anyone tell me how to work around this?


You need imageColorTransparent().

Transparency is a property of the image, not of a color. So use something like $transparent = imagecolortransparent($im) to see if there is any transparency on your image, then just ignore that color in your $colorArray or have some other way to identify the transparent color in the return from your function. That all depends on how you're using the returned data.


Need Your Help

Heap corruption when deleting global array

c++ arrays winapi delete-operator heap-corruption

The following code seems to be causing heap corruption whenever the debugger hits the delete[] operator. It's trying to delete a global array of structures which was defined as an extern in the he...

Object oriented comunication via TCP in C#

c# oop design-patterns design tcp

I'm developing a simple application that will receive data from a hardware via TCP.

About UNIX Resources Network

Original, collect and organize Developers related documents, information and materials, contains jQuery, Html, CSS, MySQL, .NET, ASP.NET, SQL, objective-c, iPhone, Ruby on Rails, C, SQL Server, Ruby, Arrays, Regex, ASP.NET MVC, WPF, XML, Ajax, DataBase, and so on.