PHP Doku:: Ermittelt die Farbwerte einer angegebenen Farb-Palette - function.imagecolorsforindex.html

Verlauf / Chronik / History: (10) anzeigen

Sie sind hier:
Doku-StartseitePHP-HandbuchFunktionsreferenzBildverarbeitung und -generierungBildbearbeitung und GDGD- und Image-Funktionenimagecolorsforindex

Ein Service von Reinhard Neidl - Webprogrammierung.

GD- und Image-Funktionen

<<imagecolorset

imagecolorstotal>>

imagecolorsforindex

(PHP 4, PHP 5)

imagecolorsforindex Ermittelt die Farbwerte einer angegebenen Farb-Palette

Beschreibung:

array imagecolorsforindex ( resource $im , int $index )

Gibt ein assoziatives Array mit Rot-, Grün- und Blau-Werten zurück, die die Werte des Farb-Paletten-Index von im darstellen.

Siehe auch imagecolorat() und imagecolorexact().


11 BenutzerBeiträge:
- Beiträge aktualisieren...
chemo dot rojas at kubic dot cl
4.11.2008 15:19
I've created a function to retrieve the HSV (HSB) value of
an RGB color. It's useful if you need a HSV representation
of color instead the HSL one.

The RGB array passed as parameter, you can obtain it from
the ImageColorsForIndex() function. If not, you can pass
any array, you must replace the indexes from $rgb['xxx']
to suit your array.

<?php

//----------------------------------------------------------
// Name:            rgb2hsv()
// Description:        Convert RGB colors array
//                    into HSV (HSB) array
//
// Parameter:        - $rgb:
//                      array of RGB color,
//                      each component with range 0 to 255
// Return:            - array($h, $s, $v):
//                      array HSV set with its default range
//                      (H to 360º, S and V to 100%)
//---------------------------------------------------------

function rgb2hsv($rgb){
   
$r = $rgb['red'];
   
$g = $rgb['green'];
   
$b = $rgb['blue'];

   
$minVal = min($r, $g, $b);
   
$maxVal = max($r, $g, $b);
   
$delta  = $maxVal - $minVal;

   
$v = $maxVal / 255;

    if (
$delta == 0) {
       
$h = 0;
       
$s = 0;
    } else {
       
$s = $delta / $maxVal;
       
$del_R = ((($maxVal - $r) / 6) + ($delta / 2)) / $delta;
       
$del_G = ((($maxVal - $g) / 6) + ($delta / 2)) / $delta;
       
$del_B = ((($maxVal - $b) / 6) + ($delta / 2)) / $delta;

        if (
$r == $maxVal){
           
$h = $del_B - $del_G;
        } else if (
$g == $maxVal) {
           
$h = (1 / 3) + $del_R - $del_B;
        } else if (
$b == $maxVal) {
           
$h = (2 / 3) + $del_G - $del_R;
        }
       
        if (
$h < 0){
           
$h++;
        }
        if (
$h > 1) {
           
$h--;
        }
    }
   
$h = round($h * 360);
   
$s = round($s * 100);
   
$v = round($v * 100);
   
    return array(
$h, $s, $v);
}
?>
hofstadler dot andi at gmx dot at
7.10.2008 21:36
I have optimized the rgb2hsl function from slepichev a bit, so that it is a bit shorter and hopefully a bit faster:

<?php
/**
 * Convert RGB colors array into HSL array
 *
 * @param array $ RGB colors set, each color component with range 0 to 255
 * @return array HSL set, each color component with range 0 to 1
 */
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 (
0 == $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/3 + ($clrB - $clrR) / (6.0 * $deltaMax);
        }
        else {
           
$H = 2 / 3 + ($clrR - $clrG) / (6.0 * $deltaMax);
        }

        if (
0 > $H) $H += 1;
        if (
1 < $H) $H -= 1;
    }
    return array(
$H, $S,$L);
}
?>
matrebatre
7.08.2008 20:11
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().
derek at idreams dot co dot uk
30.11.2007 21:45
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)

<?
function imagetosepia(&$img) {
  if (!(
$t = imagecolorstotal($img))) {
   
$t = 256;
   
imagetruecolortopalette($img, true, $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 );
  }
}
?>
joe dot scylla at gmail dot com
28.11.2007 15:35
While it's quite easy and intuitive to get the alpha transparency of a pixel with:

<?php
$rgba    
= imagecolorsforindex($image, imagecolorat($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;
?>
tim at leethost dot com
10.09.2007 7:01
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

<?
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, $img, 0, 0, 0, 0, $width, $height, $width, $height);
  for (
$i = 0; $i < 256; $i++) imagecolorset ($dest, $i, min($i * abs($tint_r) / 255, 255), min($i * abs($tint_g) / 255, 255), min($i * abs($tint_b) / 255, 255));
 
$img = imagecreate ($width, $height);
 
imagecopy ($img, $dest, 0, 0, 0, 0, $width, $height);
 
imagedestroy ($dest);
}
?>
slepichev at yahoo dot com
6.09.2007 12:50
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
/**
 * Convert RGB colors array into HSL array
 *
 * @param array $ RGB colors set
 * @return array HSL set
 */
 
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 (
0 == $deltaMax){
        
$H = 0;
        
$S = 0;
         }
    else{
         if (
0.5 > $L){
            
$S = $deltaMax / ($clrMax + $clrMin);
             }
        else{
            
$S = $deltaMax / (2 - $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 = (1 / 3) + $deltaR - $deltaB;
             }
        else if (
$clrB == $clrMax){
            
$H = (2 / 3) + $deltaG - $deltaR;
             }
         if (
0 > $H) $H += 1;
         if (
1 < $H) $H -= 1;
         }
     return array(
$H, $S, $L);
     }
?>
admin at phpgfx dot com
26.08.2007 18:54
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 );
    }
}

?>
adspeed.com
24.08.2005 1:05
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
strozek(a)deas()harvard()edu
25.06.2004 22:32
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)
m4551 at abasoft dot it
23.04.2004 18:23
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);
    }
}



PHP Powered Diese Seite bei php.net
The PHP manual text and comments are covered by the Creative Commons Attribution 3.0 License © the PHP Documentation Group - Impressum - mail("TO:Reinhard Neidl",...)