文字

imagecolorsforindex

(PHP 4, PHP 5, PHP 7)

imagecolorsforindex取得某索引的颜色

说明

array imagecolorsforindex ( resource $image , int $index )

本函数返回一个具有 red,green,blue 和 alpha 的键名的关联数组,包含了指定颜色索引的相应的值。

Example #1 imagecolorsforindex() 例子

<?php

// 打开一幅图像
$im  imagecreatefrompng ( 'nexen.png' );

// 取得一点的颜色
$start_x  40 ;
$start_y  50 ;
$color_index  imagecolorat ( $im $start_x $start_y );

// 使其可读
$color_tran  imagecolorsforindex ( $im $color_index );

// 显示该颜色的值
echo  '<pre>' ;
print_r ( $color_tran );
echo 
'</pre>' ;

?>

本例将输出:

Array
(
    [red] => 226
    [green] => 222
    [blue] => 252
    [alpha] => 0
)

参见 imagecolorat() imagecolorexact()

用户评论:

[#1] hofstadler dot andi at gmx dot at [2008-10-07 12:36:36]

I have optimized the rgb2hsl function from slepichev a bit, so that it is a bit shorter and hopefully a bit faster:

<?php

function rgb2hsl($rgb){
    
$clrR = ($rgb[0]);
    
$clrG = ($rgb[1]);
    
$clrB = ($rgb[2]);
     
    
$clrMin min($clrR$clrG$clrB);
    
$clrMax max($clrR$clrG$clrB);
    
$deltaMax $clrMax $clrMin;
     
    
$L = ($clrMax $clrMin) / 510;
     
    if (
== $deltaMax){
        
$H 0;
        
$S 0;
    }
    else{
        if (
0.5 $L){
            
$S $deltaMax / ($clrMax $clrMin);
        }
        else{
            
$S $deltaMax / (510 $clrMax $clrMin);
        }

        if (
$clrMax == $clrR) {
            
$H = ($clrG $clrB) / (6.0 $deltaMax);
        }
        else if (
$clrMax == $clrG) {
            
$H 1/+ ($clrB $clrR) / (6.0 $deltaMax);
        }
        else {
            
$H + ($clrR $clrG) / (6.0 $deltaMax);
        }

        if (
$H$H += 1;
        if (
$H$H -= 1;
    }
    return array(
$H$S,$L);
}
?>

[#2] matrebatre [2008-08-07 11:11:17]

Be aware that

<?php
$rgba     
imagecolorat($image$x$y);
$r = ($rgba >> 16) & 0xFF;
$g = ($rgba >> 8) & 0xFF;
$b $rgba 0xFF;
$a     = ($rgba 0x7F000000) >> 24;
?>
 

will only work for truecolor images. With eg GIF images, this will have strange results. For GIF images, you should always use imagecolorsforindex().

[#3] derek at idreams dot co dot uk [2007-11-30 12:45:12]

The earlier microsoft sepia example seemed to have a factor in which made it pinky... here is a modified example which uses just the Microsoft sepia (as per the wiki sepia entry)

<?php
function imagetosepia(&$img) {
  if (!(
$t imagecolorstotal($img))) {
    
$t 256;
    
imagetruecolortopalette($imgtrue$t);
  }
  
$total imagecolorstotal$img );
  for ( 
$i 0$i $total$i++ ) {
    
$index imagecolorsforindex$img$i );
    
$red = ( $index["red"] * 0.393 $index["green"] * 0.769 $index["blue"] * 0.189 );
    
$green = ( $index["red"] * 0.349 $index["green"] * 0.686 $index["blue"] * 0.168 ); 
    
$blue = ( $index["red"] * 0.272 $index["green"] * 0.534 $index["blue"] * 0.131 ); 
    if (
$red 255) { $red 255; }
    if (
$green 255) { $green 255; }
    if (
$blue 255) { $blue 255; }
    
imagecolorset$img$i$red$green$blue );
  }
}
?>

[#4] joe dot scylla at gmail dot com [2007-11-28 06:35:53]

While it's quite easy and intuitive to get the alpha transparency of a pixel with:

<?php
$rgba     
imagecolorsforindex($imageimagecolorat($image$x$y));
$alpha     $rgba["alpha"];
?>


you should use the return value of the command imagecolorat to get the alpha transparency with the code below because it's much faster and will have a major impact if you process every pixel of an image:

<?php
$rgba     
imagecolorat($image$x$y);
$alpha     = ($rgba 0x7F000000) >> 24;
?>

[#5] tim at leethost dot com [2007-09-09 22:01:50]

Here's a better grayscale, sepia, and general tinting function.  This function is better because:

1) Works with true color images (the other sepia code didn't).
2) Provides a more gooder grayscale conversion (yes, I said "more gooder").  The other grayscale code used imagetruecolortopalette, which just doesn't work well for grayscale conversion.
3) The other sepia code was really colorful, a little too much for my taste.  This function allows you to optionally set the tinting of the grayscale to anything you wish.
4) Single function for grayscale, sepia, and any other tinting you can dream up.

Here's some examples:

imagegrayscaletint ($img);  // Grayscale, no tinting
imagegrayscaletint ($img,304,242,209);  // What I use for sepia
imagegrayscaletint ($img,0,0,255);  // A berry blue image

The RGB values for tinting are normally from 0 to 255.  But, you can use values larger than 255 to lighten and "burn" the image.  The sepia example above does this a little, the below example provides a better example of lightening the image and burning the light areas out a little:

imagegrayscaletint ($img,400,400,400);  // Lighten image
imagegrayscaletint ($img,127,127,127);  // Darken image

<?php
function imagegrayscaletint (&$img$tint_r 255$tint_g 255$tint_b 255) {
  
$width imagesx($img); $height imagesy($img);
  
$dest imagecreate ($width$height);
  for (
$i=0$i<256$i++) imagecolorallocate ($dest$i$i$i);
  
imagecopyresized ($dest$img0000$width$height$width$height);
  for (
$i 0$i 256$i++) imagecolorset ($dest$imin($i abs($tint_r) / 255255), min($i abs($tint_g) / 255255), min($i abs($tint_b) / 255255));
  
$img imagecreate ($width$height);
  
imagecopy ($img$dest0000$width$height);
  
imagedestroy ($dest);
}
?>

[#6] slepichev at yahoo dot com [2007-09-06 03:50:41]

If you would like to change the intensity or lightness level of a specific color, you will need to convert the color format from RGB to HSL. 
following function convert RGB array(red,green,blue) to HSL array(hue, saturation, lightness)
<?php

 
function rgb2hsl($rgb){
    
     
$clrR = ($rgb[0] / 255);
     
$clrG = ($rgb[1] / 255);
     
$clrB = ($rgb[2] / 255);
    
     
$clrMin min($clrR$clrG$clrB);
     
$clrMax max($clrR$clrG$clrB);
     
$deltaMax $clrMax $clrMin;
    
     
$L = ($clrMax $clrMin) / 2;
    
     if (
== $deltaMax){
         
$H 0;
         
$S 0;
         }
    else{
         if (
0.5 $L){
             
$S $deltaMax / ($clrMax $clrMin);
             }
        else{
             
$S $deltaMax / ($clrMax $clrMin);
             }
         
$deltaR = ((($clrMax $clrR) / 6) + ($deltaMax 2)) / $deltaMax;
         
$deltaG = ((($clrMax $clrG) / 6) + ($deltaMax 2)) / $deltaMax;
         
$deltaB = ((($clrMax $clrB) / 6) + ($deltaMax 2)) / $deltaMax;
         if (
$clrR == $clrMax){
             
$H $deltaB $deltaG;
             }
        else if (
$clrG == $clrMax){
             
$H = (3) + $deltaR $deltaB;
             }
        else if (
$clrB == $clrMax){
             
$H = (3) + $deltaG $deltaR;
             }
         if (
$H$H += 1;
         if (
$H$H -= 1;
         }
     return array(
$H$S$L);
     }
?>

[#7] admin at phpgfx dot com [2007-08-26 09:54:30]

this is a sepia filter using microsoft's definition

<?php

function imagesepia$img ) {
    
$total imagecolorstotal$img );
    for ( 
$i 0$i $total$i++ ) {
        
$index imagecolorsforindex$img$i );
        
$red = ( $index["red"] * 0.393 $index["green"] * 0.769 $index["blue"] * 0.189 ) / 1.351;
        
$green = ( $index["red"] * 0.349 $index["green"] * 0.686 $index["blue"] * 0.168 ) / 1.203;
        
$blue = ( $index["red"] * 0.272 $index["green"] * 0.534 $index["blue"] * 0.131 ) / 2.140;
        
imagecolorset$img$i$red$green$blue );
    }
}

?>

[#8] adspeed.com [2005-08-23 16:05:02]

To correct m4551 at abasoft dot it example:

ImageTrueColorToPalette($im,1,$t);

might give less colors than $t, so the for loop should call "$i<ImageColorsTotal($im)" instead of "$i<$t" just to be sure, or you'll get the warning: Color index [0-9] out of range

[#9] strozek(a)deas()harvard()edu [2004-06-25 13:32:28]

Regarding m4551's method of conversion -- the actual CCIR-approved RGB-to-grayscale conversion is as follows:

grayscale component = 0.2125*R + 0.7154*G + 0.0721*B

(cf. CCIR Recommendation 709 for modern monitors)

[#10] m4551 at abasoft dot it [2004-04-23 09:23:40]

here's a function to greyscale an image even from a truecolor source (jpeg or png).

slightly poor quality, but very fast...

function imagegreyscale(&$img, $dither=1) {
if (!($t = imagecolorstotal($img))) {
$t = 256;
imagetruecolortopalette($img, $dither, $t);
}
for ($c = 0; $c < $t; $c++) {    
$col = imagecolorsforindex($img, $c);
$min = min($col['red'],$col['green'],$col['blue']);
$max = max($col['red'],$col['green'],$col['blue']);
$i = ($max+$min)/2;
imagecolorset($img, $c, $i, $i, $i);
}
}

上一篇: 下一篇: