2010-01-22 72 views
0

我目前正在研究需要分析多个图像并找出它们最接近的颜色的应用程序。带透明度的PHP图像颜色分析

因此,我发现了一个代码段正是如此:

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 
     imagedestroy($block); 
     } 
    } 
    //destroy the source image 
    imagedestroy($im); 
    return $colorArray; 
    } 

问题是每当我提供具有透明性的图像,GDLib consinders透明度为黑色,从而产生错误的(暗得多)输出比真的是这样。

例如该图标,其中围绕箭头的白色区域实际上是透明的:

example http://img651.imageshack.us/img651/995/screenshot20100122at113.png

谁能告诉我如何解决此问题?

回答

1

您需要imageColorTransparent()。 http://www.php.net/imagecolortransparent

透明度是图像的属性,而不是颜色。因此,使用像$transparent = imagecolortransparent($im)这样的东西来查看图像是否有任何透明度,然后只需忽略$ colorArray中的那个颜色,或者使用其他方法来标识函数返回的透明颜色。这一切都取决于你如何使用返回的数据。

--M