PHP Doku:: Ermittelt den Farbwert eines Bildpunktes - function.imagecolorat.html

Verlauf / Chronik / History: (1) anzeigen

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

Ein Service von Reinhard Neidl - Webprogrammierung.

GD- und Image-Funktionen

<<imagecolorallocatealpha

imagecolorclosest>>

imagecolorat

(PHP 4, PHP 5)

imagecoloratErmittelt den Farbwert eines Bildpunktes

Beschreibung:

int imagecolorat ( resource $im , int $x , int $y )

Ermittelt den Farb-Wert eines Pixels an den Koordinaten x / y der mit im bestimmten Grafik.

Beachten Sie auch imagecolorset() und imagecolorsforindex().


31 BenutzerBeiträge:
- Beiträge aktualisieren...
madtrader117 at gmail dot com
8.08.2010 16:51
Here's a function I made for finding the size of the black border surrounding some movie thumbnails where the movie itself has had black padding added in order to maintain aspect ratio.

<?php
    define
("DEBUG_OUT",TRUE);
   
$border_size = find_border_size($path);
   
print_r($border_size);
   
/*
     * $border = max(find_border_size("img.jpg"));
     * $thumb_size_x = 180+(2*$border);
     * $thumb_size_y = 240+(2*$border);
     * $thumb_size = $thumb_size_x . "x" . $thumb_size_y; (String to use in the -s param of ffmpeg)
     * $crop_cmd = "-croptop $border -cropbottom $border -cropright $border -cropleft $border";
     */
   
function find_border_size($path)
    {
       
/* The pad var is essentially a 'feather' value. Unless one of the RGB values rises
         * above $pad we are saying to continue. You can try different values but with 10 I
         * would still get a decent sized border due to the bleedover of the movie into
         * the hat.
         */
       
$pad = 20;
       
$border_y = 0;
       
$border_x = 0;

        if(!
file_exists($path))
        {
            if(
DEBUG_OUT) echo("Error: $path not found.\n");
            return
FALSE;
        }
        else
        {
            if(
DEBUG_OUT) echo("Opening: $path ...\n");
        }
       
$im = @imagecreatefromjpeg($path);
        if(!
$im) return FALSE;
       
$height = imagesy($im);
       
$width = imagesx($im);

       
/* Let's start at 0, 0 and keep going till we hit a color */
       
if(DEBUG_OUT) echo("Image - Height: $height / Width: $width\n");
       
/* Border Height(Y) */
       
$center_width = ceil($width/2);
        for(
$i=0; $i<$height; $i++)
        {
           
$rgb = imagecolorat($im,$center_width,$i);
           
$r = ($rgb >> 16) & 0xFF;
           
$g = ($rgb >> 8) & 0xFF;
           
$b = $rgb & 0xFF;
            if(
DEBUG_OUT) echo("Height: ($center_width,$i) R: $r / G: $g / B: $b\n");
            if(
$r >= $pad || $g >= $pad || $b >= $pad)
            {
               
$border_y = $i;
                if(
$border_y == $height) $border_y = 0;
                break;
            }
        }

       
/* Border Width(X) */
       
$center_height = ceil($height/2);
        for(
$i=0; $i<$width; $i++)
        {
           
$rgb = imagecolorat($im,$i,$center_height);
           
$r = ($rgb >> 16) & 0xFF;
           
$g = ($rgb >> 8) & 0xFF;
           
$b = $rgb & 0xFF;
            if(
DEBUG_OUT) echo("Width: ($i,$center_width) R: $r / G: $g / B: $b\n");
            if(
$r >= $pad || $g >= $pad || $b >= $pad)
            {
               
$border_x = $i;
                if(
$border_x == $width) $border_x = 0;
                break;
            }
        }

       
/* I am making the border a multiple of 2 since I am sending these values to FFMpeg */
       
if($border_x != 0)
        {
           
$border_x /= 2;
           
$border_x = round($border_x);
           
$border_x *= 2;
        }
        if(
$border_y != 0)
        {
           
$border_y /= 2;
           
$border_y = round($border_y);
           
$border_y *= 2;
        }
        if(
DEBUG_OUT) echo("Border Width: $border_x / Border Height: $border_y\n");
        return array(
$border_x,$border_y);
    }
?>
black at scene-si dot org
18.05.2010 14:39
If an image is filled with a solid color (rgb 0,0,0) the average color will be 0,0,0, and the histogram will have the maximum values at r[0], g[0], and b[0]. Since we remove those values with the tolerance (+- 16), we are only left with colors outside of average.

If the removed colors represent more than 90% of the image (we remove 6.25-12.5% of the histogram based on the average color), then we asume the image is blank.

This detects solid filled images of any color, and with images of very little color variance (blank wall, blue sky with no clouds, nearly faded images, very low contrast and low color range images). The function is perfect for checking if a frame from a video is blank or not (in case you are generating thumbnails).

<?php
function isBlank($gd_resource, $tolerance, $percent)
{
        list(
$w,$h) = array(imagesx($gd_resource), imagesy($gd_resource));

       
$count = 0;
       
$hr = $hg = $hb = array();
        for (
$i=0; $i<$h; $i++) {
                for (
$j=0; $j<$w; $j++) {
                       
$pos = imagecolorat($gd_resource, $j, $i);
                       
$f = imagecolorsforindex($gd_resource, $pos);
                       
$hr[$f['red']] = issetor($hr[$f['red']],0) + 1;
                       
$hg[$f['green']] = issetor($hg[$f['green']],0) + 1;
                       
$hb[$f['blue']] = issetor($hb[$f['blue']],0) + 1;
                       
$count ++;
                }
        }

       
$rc = array_sum($hr);
       
$gc = array_sum($hg);
       
$bc = array_sum($hb);

       
$r = $rc/$count;
       
$g = $gc/$count;
       
$b = $bc/$count;

       
$ra = range(max(0,$r-$tolerance), min(255,$r+$tolerance));
       
$ga = range(max(0,$g-$tolerance), min(255,$g+$tolerance));
       
$ba = range(max(0,$b-$tolerance), min(255,$b+$tolerance));

        foreach (
$ra as $rx) {
                unset(
$hr[$rx]);
        }
        foreach (
$ga as $gx) {
                unset(
$hg[$gx]);
        }
        foreach (
$ba as $bx) {
                unset(
$hb[$bx]);
        }

       
$red = floatval(array_sum($hr)+1) / floatval($rc);
       
$green = floatval(array_sum($hg)+1) / floatval($gc);
       
$blue = floatval(array_sum($hb)+1) / floatval($bc);

        if (
$red<$percent && $green<$percent && $blue<$percent) {
                return
true;
        }
        return
false;
}

// Example;

isBlank($gd_resource, 16, 0.1);

?>
tumbler
15.02.2009 8:36
With this example you can calculate the weather status :)
Just put an image (webcam) in an img folder, and run this script.

<?php
    $img
= "img/clouds.gif";
   
$imgHand = ImageCreateFromGIF;
   
$imgSize = GetImageSize($img);
   
$imgWidth = $imgSize[0];
   
$imgHeight = $imgSize[1];
    echo
'<img src="'.$img.'"><br><br>';
    for (
$l = 0; $l < $imgHeight; $l++) {
        for (
$c = 0; $c < $imgWidth; $c++) {
           
$pxlCor = ImageColorAt($imgHand,$c,$l);
           
$pxlCorArr = ImageColorsForIndex($imgHand, $pxlCor);
           
$htmlCor = DecHex($pxlCorArr["red"]&240) . DecHex($pxlCorArr["red"]&240) . DecHex($pxlCorArr["red"]&240);
           
$grey[convert($htmlCor)/16]++;
        }
    }
   
    for (
$i=0;$i<16;$i++){
        echo
'greyvalue '.$i.' : '.$grey[$i].'<br>';
    }
    echo
'<br><br>Status: <b>'.status(count($grey)).'</b><br>';
   
    function
convert($color){
       
$hexdec=HexDec($color)&240;
       
$decbin=DecBin($hexdec);
       
$decbin = substr("00000000",0,8 - strlen($decbin)) . $decbin;
       
$bindec = BinDec($decbin);
        return
$bindec;
    }
   
    function
status($range){
        if (
$range >= 13) return "Heavy Clouds";
        elseif (
$range > 9 && $range < 13) return "Cloudy";
        elseif (
$range > 4 && $range <=9) return "Light cloudy";
        elseif (
$range <= 4) return "Clear";
    }
?>
Richard
20.09.2008 20:49
With the following functions you can not only convert a 24 bit RGB integer to its corresponding red, green, and blue values, but also 32 bit RGBA integers to its corresponding red, green, blue, and ALPHA values.

Not only that, but I even threw in a function for converting those red, green, blue, and alpha values back into a 32 bit RGBA integer.

Sample usage:
<?php
$int
= rgba2int(255, 255, 255, 16);
echo
$int . "<br>";
$rgba = int2rgba($int);
print_r($rgba);
?>

What it should output:
285212671
Array
(
    [r] => 255
    [g] => 255
    [b] => 255
    [a] => 16
)

<?php
function rgba2int($r, $g, $b, $a=1) {
   
/*
    This function builds a 32 bit integer from 4 values which must be 0-255 (8 bits)
    Example 32 bit integer: 00100000010001000000100000010000
    The first 8 bits define the alpha
    The next 8 bits define the blue
    The next 8 bits define the green
    The next 8 bits define the red
    */
   
return ($a << 24) + ($b << 16) + ($g << 8) + $r;
}

function
int2rgba($int) {
   
$a = ($int >> 24) & 0xFF;
   
$r = ($int >> 16) & 0xFF;
   
$g = ($int >> 8) & 0xFF;
   
$b = $int & 0xFF;
    return array(
'r'=>$r, 'g'=>$g, 'b'=>$b, 'a'=>$a);
}
?>
Scott Thompson (VBAssassin)
16.04.2008 14:02
I've found this function very useful when wanting to manipulate an existing image. An example would be to simply flip an image (source code here: http://www.coderprofile.com/source-code/372/ )

The principle i use a lot is to scan through an image pixel by pixel performing some kind of action on that pixel... and then saving the newly created pixel on to a new canvas ready to display to the browser.

The only problem i find is speed... so some kind of caching mechanism and dimensions limitation on images that are processed is recommended for high traffic use.

Kind regards,
Scott
p h o c i s [a-t] g m a i l c o m
20.11.2007 18:47
I believe GD has an issue with transparent mattes and alpha blending. It seems GD thinks that some images have a black matte transparency (meaning that the image is built on a black matte instead of transparent).

And while "alan hogan dot com slash contact" solution does deal with this, the results seem to be... glitchy. you get different results each time you do it, and they are not always the best.

So I made a different solution that, while it looks better on a white background and is consistent, still sort of mangles the image just a bit by merging all blended pixels with the transparent color.

// Load image
$img = imagecreatefrompng('my_broken_png.png');

// Make matte canvas
$matte = imagecreatetruecolor(16,16);
$trans_color = imagecolorallocatealpha($matte,254,254,254,0);
imagefill($matte, 0,0,$trans_color);

// Put the old image on the matte
imagecopy($matte,$img,0,0,0,0,16,16);

// Turn the matte color into full alpha (blended pixels will not be affected)
imagecolortransparent($matte,$trans_color);

// Display image
header('Content-Type: image/gif');  
imagegif($matte);
alan hogan dot com slash contact
12.11.2007 11:44
As creamdog noted before, the alpha channel IS available from this function! (The manual should probably be updated to include this!)

$rgba = imagecolorat($im,$x,$y);
$alpha = ($rgba & 0x7F000000) >> 24;

$alpha will then contain the TRANSPARENCY (NOT OPACITY) level. So 127, the max, would be completely transparent, and 0 would be completely opaque.

Using this information, it is possible to write a dithering png-to-gif function like the completely working simple one below:

<?php
$im
= imagecreatefrompng($pngRel);
       
$transparentColor = imagecolorallocate($im, 0xfe, 0x3, 0xf4 );
       
$height = imagesy($im);
       
$width = imagesx($im);
        for(
$x = 0; $x < $width; $x++){
            for(
$y = 0; $y < $height; $y++) {
               
$alpha = (imagecolorat($im,$x,$y) & 0x7F000000) >> 24;
               
//DITHER!
               
if ($alpha > 3 && (
                       
$alpha >=127-3 ||
                        (
rand(0,127))>=(127-$alpha)
                    )){
                   
imagesetpixel($im,$x,$y,$transparentColor);
                }

            }
        }
       
imagecolortransparent($im, $transparentColor);
       
imagegif($im, $gifRel);//save
       
header("Content-type: image/gif");
       
readfile($gifRel); //pass thru to browser

?>
pocze_zsolt at hotmail dot com
15.09.2007 13:55
This is a histogram-stretching function to get a better contrast:

function contrast_stretch( $img ) {
    $x = imagesx($img);
    $y = imagesy($img);

    $min=255.0;
    $max=0.0;

    for($i=0; $i<$y; $i++) {
    for($j=0; $j<$x; $j++) {
        $pos = imagecolorat($img, $j, $i);
        $f = imagecolorsforindex($img, $pos);
        $gst = $f["red"]*0.15 + $f["green"]*0.5 + $f["blue"]*0.35;
        if($gst>$max) $max=$gst;
        if($gst<$min) $min=$gst;
    }
    }

    $distance = $max-$min;

    for($i=0; $i<$y; $i++) {
    for($j=0; $j<$x; $j++) {
        $pos = imagecolorat($img, $j, $i);
        $f = imagecolorsforindex($img, $pos);

        $red = 255*($f["red"]-$min)/$distance;
        $green = 255*($f["green"]-$min)/$distance;
        $blue = 255*($f["blue"]-$min)/$distance;

        if($red<0) $red = 0.0;
        elseif($red>255) $red=255.0;

        if($green<0) $green = 0.0;
        elseif($green>255) $green=255.0;

        if($blue<0) $blue = 0.0;
        elseif($blue>255) $blue=255.0;

        $color = imagecolorresolve($img, $red, $green, $blue);
        imagesetpixel($img, $j, $i, $color);
    }
    }
}
markignore.atsymbol.ignorepnod.co.uk
1.08.2007 1:58
The example given for returning the RGB values from the function (using & 0xFF) didn't work for me for PNG or GIF images. If you have this problem, try the following (which works):

<?php
  $pixelrgb
= imagecolorat($source,$x,$y);
 
$cols = imagecolorsforindex($source, $pixelrgb);
 
$r = $cols['red'];
 
$g = $cols['green'];
 
$b = $cols['blue'];
?>
Gromitt
6.03.2007 5:17
imagecolorat() will display a Notice if you attempt to query a pixel which is out of bounds, and will return false :

<?php

$img
= imagecreatefromjpeg('test.jpg');
var_dump(imagecolorat($img, -1, 0));

?>

Output :

Notice: imagecolorat(): -1,0 is out of bounds in /test.php on line 4
bool(false)

29.11.2006 13:45
//test if a Jpeg is greyscale or color

function iscolor($pic_adress){

   
// A Pixel is Greyscale if the r = B = G
    //example: colorpixel R=250, G=140 , B=19  Greyscale Pixel R=110, G= 110, B=110
   
    //we do a check of 10 Pixels to find out if the Picture is Greyscale
    $tocheck = 10;
   
    $iscolor=false;
   
    $temp= getimagesize($pic_adress);
   
    $x= $temp[0];
    $y= $temp[1];
   
    $im= imagecreatefromjpeg($pic_adress);

    //now check out the Pixels   
    for( $i = 0 ; $i< $tocheck && !$iscolor; $i++){
   
   
    // Here a Random Pixel is chosen
    $color = imagecolorat($im,rand(0,$x),rand(0,$y));
   
    //Problem color is an int
    //The Hex view on the number is RRGGBB
    // Here we get the blue part of the Pixel
    $blue = 0x0000ff & $color;
   
    $green = 0x00ff00 & $color;
   //The Green part we have to push 8 bits to the right to get an Compareable result
    $green = $green >> 8;
    $red =0xff0000 & $color;
    //red part needs to be pushed 16 bit
    $red = $red >> 16;
    // if one of the Pixels isnt Greyscale it breaks an you know this is a color picture
    if( $red!= $green || $green!= $blue){
        $iscolor = true;
        break;
        }
    }
    return $iscolor;

}
Luciano Ropero
27.10.2006 20:31
I made a function that calculates the average color of a given image resource and returns it in "#rrggbb" format (hex):

function average($img) {
    $w = imagesx($img);
    $h = imagesy($img);
    $r = $g = $b = 0;
    for($y = 0; $y < $h; $y++) {
        for($x = 0; $x < $w; $x++) {
            $rgb = imagecolorat($img, $x, $y);
            $r += $rgb >> 16;
            $g += $rgb >> 8 & 255;
            $b += $rgb & 255;
        }
    }
    $pxls = $w * $h;
    $r = dechex(round($r / $pxls));
    $g = dechex(round($g / $pxls));
    $b = dechex(round($b / $pxls));
    if(strlen($r) < 2) {
        $r = 0 . $r;
    }
    if(strlen($g) < 2) {
        $g = 0 . $g;
    }
    if(strlen($b) < 2) {
        $b = 0 . $b;
    }
    return "#" . $r . $g . $b;
}

Although, I've noticed that you can also get a fairly good average color generating a 1px by 1px copy with imagecopyresampled (the pixel generated is colored with the average color).
NuclearFlux
17.10.2006 18:01
code part from robert:
   $output .= '<div style="position:relative;float:left;width:' .
   $div_width . 'px;height:1px;background-color:' .
   hexcolor((($div_width > 1)?
   $previous_color:$current_color)) . '"><img src="bogus.gif"
   alt="" width="1" height="1" /></div>';

i've optimized this part so that no image is needed:

   $output .= '<div
   style="position:relative;float:left;max-width:1px>;
   max-height:1px;background-color:'.
   hexcolor((($div_width > 1)?
   $previous_color:$current_color)).'">&nbsp;</div>';

//sorry for my english, i'm a german xD
morten at nilsen dot com
11.09.2006 17:17
A better way of encoding a color value to #rrggbb:

<?php
  printf
('#%06x',$c);
?>

or

<?php
  $rgb
= sprintf('#%06x',$c);
?>
creamdog
20.04.2006 13:48
If you look in the gd library for C in gd.h you have the following defined for truecolor images.

#define gdTrueColorGetAlpha(c) (((c) & 0x7F000000) >> 24)
#define gdTrueColorGetRed(c) (((c) & 0xFF0000) >> 16)
#define gdTrueColorGetGreen(c) (((c) & 0x00FF00) >> 8)
#define gdTrueColorGetBlue(c) ((c) & 0x0000FF)

So in php you could just do it as so:

$rgba = imagecolorat($im,$x,$y);
$alpha = ($rgba & 0x7F000000) >> 24;
$red = ($rgba & 0xFF0000) >> 16;
$green = ($rgba & 0x00FF00) >> 8;
$blue = ($rgba & 0x0000FF);

And there you have what you would need if you have a truecolor image with an alpha channel.
robert at future-vision dot nl
16.12.2005 1:53
Look mom, no tables :)

I made some changes to the code from 'hazard AT krankteil DOTTILLYDO de' so the function would output a div that displays the image.

As for the size of the outputted file I can say the original png file was lots smaller, but maybe its a nice feature for small buttons or such.

The way you can use it is the same as the code from 'hazard AT krankteil DOTTILLYDO de'.

litle note: each div contains a bogus image. When this is not in IE will screw up the output.

<?
   
function hexcolor($c) {
       
$r = ($c >> 16) & 0xFF;
       
$g = ($c >> 8) & 0xFF;
       
$b = $c & 0xFF;
        return
'#'.str_pad(dechex($r), 2, '0', STR_PAD_LEFT).str_pad(dechex($g), 2, '0', STR_PAD_LEFT).str_pad(dechex($b), 2, '0', STR_PAD_LEFT);
    }
   
  
    function
png2div($filename) {

       
$img = imagecreatefrompng($filename);
       
$width = imagesx($img);
       
$height = imagesy($img);
       
$div_width = 1;
       
$previous_color = 0;
       
       
$output = '<div style="position:relative;width:' . $width . 'px;height:'. $height .'px;">';
       
        for(
$y = 0;$y < $height;++$y){
           
            for(
$x = 0;$x < $width;++$x){

               
$current_color = ImageColorAt($img, $x, $y);
               
                if(
$current_color == $previous_color && $x < $width-1){
                    ++
$div_width;
                }
                else{
                   
$output .= '<div style="position:relative;float:left;width:' . $div_width . 'px;height:1px;background-color:' . hexcolor((($div_width > 1)? $previous_color:$current_color)) . '"><img src="bogus.gif" alt="" width="1" height="1" /></div>';
                   
$previous_color = $current_color;
                   
$div_width = 1;
                }
            }
           
ob_flush();
        }
      
       
$output .= '</div>';
       
        return
$output;
       
    }

?>
hazard AT krankteil DOTTILLYDO de
12.11.2005 9:23
I saw this png to table code.. and i had written one before =)

My code does nearly the same as the one posted.. but it will compress the table with the help of colspan :)

http://hazard.krankteil.de/stuff/pngtable/imgtest.php

Code:
http://hazard.krankteil.de/stuff/pngtable/imgtest.phps
http://hazard.krankteil.de/stuff/pngtable/image.phps

It's senseless? Well maybe but kinda cool :) Try 5 or 10 as second argument for pngtable() =)
T. Dekker
27.10.2005 21:40
In GD 2.x there is support for true color images complete with an alpha channel. GD 2.x has a 7-bit (0-127) alpha channel.

While most people are used to an 8-bit (0-255) alpha channel, it is actually quite handy that GD's is 7-bit (0-127). Each pixel is represented by a 32-bit signed integer, with the four 8-bit bytes arranged like this:

 High Byte <--> Low Byte
{Alpha Channel} {Red} {Green} {Blue}

For a signed integer, the leftmost bit, or the highest bit, is used to indicate whether the value is negative, thus leaving only 31 bits of actual information. PHP's default integer value is a signed long into which we can store a single GD palette entry. Whether that integer is positive or negative tells us whether antialiasing is enabled for that palette entry.
swimgod
2.09.2005 10:36
this function i made will compare two($start-$finish) images and change the pixels with diffrent colors in the "finish" image
then displays them both next to each other in one image

another feature is "display" which will echo text
"50% on
50% off"-% count(if the number is lower then 1 it will go into one decamil count

or type "2" will be
"10023 on
3000 off"-pixel count

one last feature is "color"
which you define in an array
$color = array("r" => "244","g" => "122","b" => "100");

to finish up the discrpition im gonna show this "map" of my function
compare($start, $finish[, $color[, $display[, $type]]])
image-url($start) - base image URL
image-url($finish) - compare image URL
array($color) - array with keys "r", "g", "b" r being RED 0-255 g being GREEN 0-255 b being BLUE 0-255
bool($display) - 1 OR TRUE will return text stats from compare
int($type) - 1 OR 0 | 1 being % results | 0 being pixel results

<?
function compare($start, $finish, $color, $display, $type){

$im = ImageCreateFrompng($start);
$im2 = ImageCreateFrompng($finish);
$img['x'] = imagesx($im);
$img['y'] = imagesy($im);
$img2['x'] = imagesx($im2);
$img2['y'] = imagesy($im2);
if((
$img['x'] == $img2['x']) && ($img['y'] == $img2['y'])){

//get and set image hieght and width
$i = array("width" =>  $img['x']*2, "height" => $img['y']);
$im3 = imagecreatetruecolor($i['width'], $i['height']);
if(
$color){
$color = imagecolorallocate($im3, $color['r'], $color['g'], $color['b']);
}else{

$color = imagecolorallocate($im3, 255, 255, 255);
}
for(
$y = $img['y'];$y > 0; $y--){
for(
$x = $img['x'];$x > 0; $x--){
if(
ImageColorAt($im, $x, $y) == ImageColorAt($im2, $x, $y)){
$on = $on+1;
$rgb = ImageColorAt($im, $x, $y);
Imagesetpixel($im3, $img['x']+$x, $y, $rgb);
}else{
$off = $off+1;
imagesetpixel($im3, $img['x']+$x, $y , $color);
}
}
}
if(
$display == true){
if((
$type == "1") || (!$type)){
$off2 = (round(($off / $on)*10));
if((
$off2 == 0) && ($off > 0)){
$off2 = round(($off / $on)*10)*10;
}
$on2 = (100-$off2);
$off2 .="%";
$on2 .="%";
}else{
$off2 = $off;
$on2 = $on;
}
echo
$off2 ." off<br>". $on2 ." on";
}else{
imagecopy($im3, $im, 0, 0, 0, 0, $img['x'], $img['y']);
@
header("Content-type: image/png");
imagepng($im3);
imagedestroy($im3);
}
imagedestroy($im);
imagedestroy($im2);
return
TRUE;
}else{
return
False;
}
}
?>
Super Moi
28.08.2005 17:31
Here is a contribution for change tint.

function colorize($path_image, $red, $green, $blue)
{
      $im = imagecreatefrompng($path_image);
    $pixel = array();
       
    $n_im = imagecreatetruecolor(imagesx($im),imagesy($im));
    $fond = imagecolorallocatealpha($n_im, 255, 255, 255, 0);
    imagefill($n_im, 0, 0, $fond);
   
    for($y=0;$y<imagesy($n_im);$y++)
    {
        for($x=0;$x<imagesx($n_im);$x++)
        {
            $rgb = imagecolorat($im, $x, $y);           
            $pixel = imagecolorsforindex($im, $rgb);
           
            $r = min(round($red*$pixel['red']/169),255);
            $g = min(round($green*$pixel['green']/169),255);
            $b = min(round($blue*$pixel['blue']/169),255);
            $a = $pixel['alpha'];           
            //echo('red : '.$pixel['red'].' => '.$r.', green : '.$pixel['green'].' => '.$g.', blue : '.$pixel['blue'].' => '.$b.', alpha : '.$pixel['alpha'].' => '.$a.'<br>');
           
            $pixelcolor = imagecolorallocatealpha($n_im, $r, $g, $b, $a);
           
            imagealphablending($n_im, TRUE);
            imagesetpixel($n_im, $x, $y, $pixelcolor);
        }
    }
   
       imagepng($n_im,'test.png');
       imagedestroy($n_im);
}
bpgordon at gmail dot com
23.05.2005 23:55
(the previous post was mistyped; please delete)

The following code converts a png image to an html table made up of colored 1x1 cells. Put the path (relative to the location of the script) to the image to be converted in the query, like this: http://yoursite.com/conv.php?image.png
Remember that you can only use a remote path if remote fopen is enabled.

<?php
print "<table border=0 cellpadding=0 cellspacing=0><tr>";
$image = imagecreatefrompng($_ENV["QUERY_STRING"]);
$xdim = imagesx($image);
$ydim = imagesy($image);
for (
$x = 1; $x <= $xdim-1; $x++) {
for (
$y = 1; $y <= $ydim-1; $y++) {
$rgb = imagecolorat($image, $x, $y);
$r = ($rgb >> 16) & 0xFF;
$g = ($rgb >> 8) & 0xFF;
$b = $rgb & 0xFF;
print
"<td width=\"1\" height=\"1\" style=\"background-color: rgb($r, $g, $b);\"></td>";
}
print
"</tr><tr>";
}
print
"</tr></table>";
?>
bpgordon at gmail dot com
22.05.2005 19:19
The following code converts a png image to an html table made up of colored 1x1 cells. Put the path (relative to the location of the script) to the image to be converted in the query, like this: http://yoursite.com/conv.php?image.png
Remember that you can only use a remote path if remote fopen is enabled.

<?php
print "&lt;table border=0 cellpadding=0 cellspacing=0&gt;&lt;tr&gt;";
$image = imagecreatefrompng($_ENV["QUERY_STRING"]);
$xdim = imagesx($image);
$ydim = imagesy($image);
for (
$x = 1; $x &lt;= $xdim-1; $x++) {
for (
$y = 1; $y &lt;= $ydim-1; $y++) {
$rgb = imagecolorat($image, $x, $y);
$r = ($rgb &gt;&gt; 16) & 0xFF;
$g = ($rgb &gt;&gt; 8) & 0xFF;
$b = $rgb & 0xFF;
print
"&lt;td width=\"1\" height=\"1\" style=\"background-color: rgb($r, $g, $b);\"&gt;&lt;/td&gt;";
}
print
"&lt;/tr&gt;&lt;tr&gt;";
}
print
"&lt;/tr&gt;&lt;/table&gt;";
?>
sys NO SPAM coder at gmail dot NOSPAM dot com
26.04.2005 12:40
Just for fun: another snippet for drawing images using html only X)

<html>
<head>
<style>
<!--
body {
font-family: courier new, courier;
font-size: 7pt;
background: #000000;
color: #000000;
}
-->
</style>
</head>
<body>
<font color="#000000">
<?php

$im
= ImageCreateFromPng($_GET['img']);

$lastcolor=0;
for(
$y=0;$y<imagesy($im);$y++)
{
  for(
$x=0;$x<imagesx($im);$x++)
  {
   
$pixel = ImageColorAt($im, $x, $y);
    if(
$lastcolor != $pixel)
    {
     
printf('</font><font color="#%06x">', $pixel);
     
$lastcolor = $pixel;
    }
    echo
"*";
  }
  echo
"<br />";
}

?>
</font>
</body>
</html>

18.01.2005 23:08
Optimal:
<?php
$rgb
= imagecolorat($im, $x, $y);
$r = ($rgb >> 16);
$g = ($rgb >> 8) & 255;
$b = $rgb & 255;
?>
As you see, you can also use decimal values (faster).
jed at jed dot bz
19.10.2004 23:14
In my various play stages with photomosaics I ended up writing this function that works with GD 2. The conversion from RGB to HSL is straightforward and there are a number of papers on it on our beloved Internet; however, this function simply finds the lightness value for a pixel and works exactly the same as imagecolorat().

<?php

/* Computes the lightness of a pixel. Lightness is used in HSL notation, as well
 * as in various operations on images. This function returns a normalized value
 * for lightness between 0 and 1, inclusive (0.0 being black, 1.0 being white).
 *
 * double imagelightnessat(resource img, int x, int y)
 *        img         An open image resource to operate on (true color or palette)
 *        x, y        The coordinates of the pixel to work on
 *
 * by Jed Smith <?php $u = "jed"; $d = "bz"; printf("<%s@%s.%s>", $u, $u, $d) ?>
 */
function imagelightnessat($img, $x, $y)
{
    if(!
is_resource($img))
    {
       
trigger_error("imagelightnessat(): supplied argument is not a valid "
           
. "Image resource", E_USER_WARNING);
        return
0.0;
    }
   
$c = @imagecolorat($img, $x, $y);
    if(
$c === false) return false;
    if(
imageistruecolor($img))
    {
       
$red = ($c >> 16) & 0xFF;
       
$green = ($c >> 8) & 0xFF;
       
$blue = $c & 0xFF;
    }
    else
    {
       
$i = imagecolorsforindex($img, $c);
       
$red = $i['red'];
       
$green = $i['green'];
       
$blue = $i['blue'];
    }   
   
$m = min($red, $green, $blue);
   
$n = max($red, $green, $blue);
   
/* Because RGB isn't normalized in GD, we divide by 510 here.
     *  Lightness = (Max(RGB) + Min(RGB)) / 2
     * But that's assuming red, green, and blue are 0 through 1 inclusive.
     * Red, green, and blue are actually 0-255 (255 + 255 = 510).
     */
   
$lightness = (double)(($m + $n) / 510.0);
    return(
$lightness);
}

?>
mumig at poczta dot onet dot pl
27.02.2004 17:13
imagecolorat() works differently for png's with true color and for paletted png's - for true color it returns value of color, for paletted it returns index number and you have to use  imagecolorsforindex() to get rgb color value.
geat AT zoom DOT co DOT uk
10.06.2003 13:35
The HTML image renderer didn't work for me for some reason, but here's a version that does...

echo '<table border="0" cellspacing="0" cellpadding="0">';
$im = ImageCreateFromJPEG("IMAGE NAME");
$width = imagesx($im);
$height = imagesy($im);
for ($cy=0;$cy<$height;$cy++) {
  echo '<tr>';
  for ($cx=0;$cx<$width;$cx++) {
    $rgb = ImageColorAt($im, $cx, $cy);
    $col = imagecolorsforindex($im, $rgb);
    printf('<td width="2" height="2" bgcolor=#%02x%02x%02x></td>', $col["red"], $col["green"], $col["blue"]);
  }
echo '</tr>';
}
echo '</table>';

28.05.2003 17:54
Just for fun, here is a little snippet that "paints" a image in html only. Try it out with very small images, as this is a real browser-killer. mozilla > 120mb ram, ie > 100mb with a 300x200 image :-)

$file = "image.png";
$im = imagecreatefrompng($file);
$size_arr = getimagesize($file);

echo "<table width=".$size_arr[0]." height=".$size_arr[1]." cellpadding=0 cellspacing=0 border=0>";
for ($y=0; $y<$size_arr[1]; $y++) {
    echo "<tr>";
    for ($x=0; $x<$size_arr[0]; $x++) {
        $rgb = ImageColorAt($im, $x, $y);
        printf("<td width=1 bgcolor=%06x><img width=1></td>", $rgb);
    }
    echo "</tr>";
}
echo "</table>";
lachy at kennedia dot com
21.01.2003 3:25
It seems that if you don not have GD 2.0.1+ then the alpha value will not be available.
ceresATdivxmaniaDOTit
3.01.2003 0:46
To get RGB values of a pixel in a truecolor image:

<?
$image
=imageCreateFromJPEG('image.jpg');
$x = 10;
$y = 15;
$colorindex = imagecolorat($image,$x,$y);
$colorrgb = imagecolorsforindex($image,$colorindex);

echo
"RGB values of the pixel at position $x - $y are: $colorrgb['red'] $colorrgb['green'] $colorrgb['blue'] \n Apha value is: $colorrgb['alpha']";
?>
pete at spamisbad_holidian dot com
5.07.2002 9:36
If you have a truecolor image and absolutely need to get the actual color of a pixel, it seems like you could create a 16x16 indexed color image from a part of the True Color image containing the pixel(s) in question. Then you should be able to guarantee that the indexed sample has the indentical colors to the True Color image. you can then use this function to get the color index of a pixel in the sample.

Obviously, this would be an intensive way to get pixel colors, especially for a large image, but as far as I can tell, it's one of the very few ways to do it right now.



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",...)