PHP
downloads | documentation | faq | getting help | mailing lists | licenses | wiki | reporting bugs | php.net sites | links | conferences | my php.net

search for in the

imagecolorallocatealpha> <imagecharup
Last updated: Tue, 30 Jun 2009

view this page in

imagecolorallocate

(PHP 4, PHP 5)

imagecolorallocateAllocate a color for an image

Description

int imagecolorallocate ( resource $image , int $red , int $green , int $blue )

Returns a color identifier representing the color composed of the given RGB components.

imagecolorallocate() must be called to create each color that is to be used in the image represented by image .

Note: The first call to imagecolorallocate() fills the background color in palette-based images - images created using imagecreate().

Parameters

image

An image resource, returned by one of the image creation functions, such as imagecreatetruecolor().

red

Value of red component.

green

Value of green component.

blue

Value of blue component.

These parameters are integers between 0 and 255 or hexadecimals between 0x00 and 0xFF.

Return Values

A color identifier or FALSE if the allocation failed.

Changelog

Version Description
Prior to 5.1.3 Returns -1 if the allocation failed.

Examples

Example #1 imagecolorallocate() example

<?php

$im 
imagecreate(100100);

// sets background to red
$background imagecolorallocate($im25500);

// sets some colors
$white imagecolorallocate($im255255255);
$black imagecolorallocate($im000);

// hexadecimal way
$white imagecolorallocate($im0xFF0xFF0xFF);
$black imagecolorallocate($im0x000x000x00);

?>

See Also



imagecolorallocatealpha> <imagecharup
Last updated: Tue, 30 Jun 2009
 
add a note add a note User Contributed Notes
imagecolorallocate
shinesoldier at gmail dot com
07-May-2009 04:46
Here's a very simple function that basically does the same as imagecolorallocate(), only without needing an image resource to work.

<?php
function createcolor($r, $g, $b) {
  return
hexdec(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));
}

/* As said earlier, this function does the exact same thing as imagecolorallocate(), without needing an image resource. This means that the following two blocks of code result in the exact same thing: */

//Block 1
$color = colorcreate(105, 199, 204);

//Block 2
$img = imagecreatetruecolor(100, 100); //the arguments here don't really matter
$color = imagecolorallocate($img, 105, 199, 204);
imagedestroy($img);
?>
federicot at gmail dot com
21-May-2008 07:38
Little correction to marc-gutt's regural expression to validate hex color values. You can use this little function:

<?php
// Validate an hex color string. Return true if valid, false otherwise
function validateHexColor($color) {
   
$color = substr($color, 0, 7);
    return
preg_match('/#[0-9a-fA-F]{6}/', $color);
}
?>
djcassis at gmail dot com
22-Nov-2007 01:36
I also find the following useful when dealing with HTML hexadecimal colors :
<?php
$color
= '#FFffFF';
print_r(sscanf($color, '#%2x%2x%2x'));
?>
outputs :
Array
(
    [0] => 255
    [1] => 255
    [2] => 255
)
Ludo
25-Oct-2007 03:05
When working on an existant GIF images, if the number of different colours has reached the limits of the GIF format, imagecolorallocate will not use to the colour you ask her within the parameters, she will apply black !

That's a problem when generating images "on-the-fly" with many manipulations, from a GIF image.
To go round the problem, you have to convert the GIF image into a PNG one, and then you can work on the PNG and everything will be ok.

For example :
<?php
// first, convert into a PNG image
$handle = imagecreatefromgif('my_image.gif');
imagepng($handle, 'my_image.png');
imagedestroy($handle);

// then, you can work on it
$handle = imagecreatefrompng('my_image.png');
/*
* work on the image
*/
imagegif($handle);
?>
William Barath
29-Sep-2007 04:45
Lots of hsv2rgb commentary but no working example, so here's mine:

<?php // hsv2rgb example translated from ImageMagick C code
function hsv2rgb($h, $s, $v)
{
   
$s /= 256.0;
    if (
$s == 0.0) return array($v,$v,$v);
   
$h /= (256.0 / 6.0);
   
$i = floor($h);
   
$f = $h - $i;
   
$p = (integer)($v * (1.0 - $s));
   
$q = (integer)($v * (1.0 - $s * $f));
   
$t = (integer)($v * (1.0 - $s * (1.0 - $f)));
    switch(
$i) {
    case
0: return array($v,$t,$p);
    case
1: return array($q,$v,$p);
    case
2: return array($p,$v,$t);
    case
3: return array($p,$q,$v);
    case
4: return array($t,$p,$v);
    default: return array(
$v,$p,$q);
    }
}

$image = ImageCreateTrueColor(256,128);
for (
$y=0; $y<64; $y++) for($x=0; $x<256; $x++){
    list(
$r,$g,$b) = hsv2rgb($x | 7,255,($y*4) |7);
   
$color = ($r << 16 ) | ($g << 8) | $b;
   
imagesetpixel($image, $x, $y-4, $color);
}
for (
$y=64; $y<128; $y++) for($x=0; $x<256; $x++){
    list(
$r,$g,$b) = hsv2rgb($x|7,((127-$y)*4)|7,255);
   
$color = ($r << 16) | ($g << 8) | $b;
   
imagesetpixel($image, $x, $y-4, $color);
}
for (
$y=120; $y<128; $y++) for($x=0; $x<256; $x++){
   
$color = (($x |7) << 16) | (($x |7) << 8) | ($x |7);
   
imagesetpixel($image, $x, $y, $color);
}
header("Content-Type: image/png");
imagepng($image);
?>
info at marc-gutt dot de Marc Gutt
04-Aug-2007 06:20
rgb from hex without creating a new function or using split features:

<?php

$color
= 'FF9900';
$color = imagecolorallocate($im, hexdec('0x' . $color{0} . $color{1}), hexdec('0x' . $color{2} . $color{3}), hexdec('0x' . $color{4} . $color{5}));

?>

You can validate $color with preg_match('#[a-z0-9]{6}#i', $color) if necessary.
picklecj at rose-hulman dot edu
13-Jun-2007 08:45
Another solution to color limitation issues when creating gradients. This file takes width (px) and left and right colors (hex) and makes a gradient while only allocating 250 colors.

<?php
$leftR
= hexdec(substr($_GET["left"],0,2));
$leftG = hexdec(substr($_GET["left"],2,2));
$leftB = hexdec(substr($_GET["left"],4,2));
$rightR = hexdec(substr($_GET["right"],0,2));
$rightG = hexdec(substr($_GET["right"],2,2));
$rightB = hexdec(substr($_GET["right"],4,2));
$image=imagecreate($_GET["width"],1);
for(
$i=0;$i<250;$i++) {
   
$colorset[$i] = imagecolorallocate($image, $leftR + ($i*(($rightR-$leftR)/250)), $leftG + ($i*(($rightG-$leftG)/250)), $leftB + ($i*(($rightB-$leftB)/250)));
}
for(
$i=0;$i<($_GET["width"]);$i++) {
 
imagesetpixel ($image, $i, 0, $colorset[(int)($i/($_GET["width"]/250))] );
}
header("Content-type: image/png");
imagepng($image);
imagedestroy($image);
?>

example: gradient.php?width=640&left=000000&right=FF0000

Makes a 640px-wide image that fades from black to red.
LPEspecial at home dot nl
19-Sep-2006 08:34
This might help someone who want to  use 'ImageColorAllocate ' with a hex value

<?php
function ImageColorAllocateFromHex ($img, $hexstr)
{
 
$int = hexdec($hexstr);

  return
ImageColorAllocate ($img,
        
0xFF & ($int >> 0x10),
        
0xFF & ($int >> 0x8),
        
0xFF & $int);
}
?>
behun at webconsult dot sk
27-Aug-2006 02:26
Also, when you need more then 256 colors, use imagecreatetruecolor function. With this function you can use unlimited number of colors.
SW
14-Jan-2006 03:30
This works! A Black-Image with vertical centered white Aliased Arial-Text and same left and right margin - used for Menu-Buttons.

<?php

 
function createImgText ($string="", $fontsize=0, $marginX=0, $imgH=0 , $fontfile="", $imgColorHex="", $txtColorHex=""){
    if(
$string!=""){
       
Header("Content-type: image/png");    
       
//
       
$spacing = 0;
         
$line = array("linespacing" => $spacing);
       
$box = @imageftbbox($fontsize,0,$fontfile,$string,$line)
        or die(
"ERROR");
       
$tw=$box[4]-$box[0]; //image width
       
$marginY = $imgH - (($imgH - $fontsize) / 2);
       
$imgWidth = $tw + (2*$marginX);
       
$im = ImageCreate($imgWidth, $imgH);
       
$int = hexdec($imgColorHex);
       
$arr = array("red" => 0xFF & ($int >> 0x10),
              
"green" => 0xFF & ($int >> 0x8),
              
"blue" => 0xFF & $int);
       
$black = ImageColorAllocate($im, $arr["red"], $arr["green"], $arr["blue"]);
       
$int = hexdec($txtColorHex);
       
$arr = array("red" => 0xFF & ($int >> 0x10),
              
"green" => 0xFF & ($int >> 0x8),
              
"blue" => 0xFF & $int);
       
$white = ImageColorAllocate($im, $arr["red"], $arr["green"], $arr["blue"]);
       
ImageFtText($im, $fontsize, 0, $marginX, $marginY, $white, $fontfile, $string, array());
       
ImagePng($im);
       
ImageDestroy($im);
    }else{
        echo
"ERROR!";
    }
}
createImgText ("Hello World", 9, 10, 18, "arial.ttf", "000000", "FFFFFF");
?>
mlse
15-Nov-2005 03:19
Another more general variation on the theme using the same naming conventions as the hexdec and dechex built-in functions ...

Prototype:

array hexrgb ( string hex_string )

Returns:

An associative array of the RGB components specified in hex_string.

hexrgb() example:

<?php
$rgb
= hexrgb("0xAABBCC");
print_r($rgb);
?>

Output is:

Array
(
  [red] => 170
  [green] => 187
  [blue] => 204
)

Implementation:

<?php
function hexrgb ($hexstr)
{
 
$int = hexdec($hexstr);

  return array(
"red" => 0xFF & ($int >> 0x10),
              
"green" => 0xFF & ($int >> 0x8),
              
"blue" => 0xFF & $int);
}
?>

The output of hexdec can then be passed to imagecolorallocate and manipulated as required.
Zigbigidorlu at hotmail dot com
07-Oct-2005 12:35
Here's a very simple and very effective code to change a HEX color to RGB.

<?php
function HEX2RGB($color){
 
$color_array = array();
 
$hex_color = strtoupper($color);
 for(
$i = 0; $i < 6; $i++){
 
$hex = substr($hex_color,$i,1);
  switch(
$hex){
   case
"A": $num = 10; break;
   case
"B": $num = 11; break;
   case
"C": $num = 12; break;
   case
"D": $num = 13; break;
   case
"E": $num = 14; break;
   case
"F": $num = 15; break;
   default:
$num = $hex; break;
  }
 
array_push($color_array,$num);
 }
 
$R = (($color_array[0] * 16) + $color_array[1]);
 
$G = (($color_array[2] * 16) + $color_array[3]);
 
$B = (($color_array[4] * 16) + $color_array[5]);
 return array(
$R,$G,$B);
 unset(
$color_array,$hex,$R,$G,$B);
}
?>
mail at kailashnadh dot name
28-Jun-2005 08:17
This nifty function will produce the negative of a given image!

<?php

/********************************

     Code by Kailash Nadh
     http://kailashnadh.name

     usage:
     img2neg("my_pic.jpg");

*********************************/

function img2neg($pic) {

   
header("Content-type: image/jpeg");

   
$source=imagecreatefromjpeg($pic);    // Source
   
$width=imagesx($source);    $height=imagesy($source);

   
$im = imagecreatetruecolor($width, $height);    // Our negative img in the making

   
for($y=0; $y < $height; $y++) {
        for(
$x=0; $x < $width; $x++) {

       
$colors=imagecolorsforindex($source, imagecolorat($source, $x,$y));

           
// this is what makes the colors negative
           
$r=255-$colors['red'];
           
$g=255-$colors['green'];
           
$b=255-$colors['blue'];
           
$test=imagecolorallocate($im, $r,$g,$b);
           
imagesetpixel($im,$x, $y, $test);
        }
    }

   
imagejpeg($im);
   
imagedestroy($im);
}

?>
andreoli dot carlo at libero dot it
08-Jun-2005 07:08
hsl to RGB
(not yet optimized but it function)

<?php
function hslToRgb ($h, $s, $l) {
    if (
$h>240 || $h<0) return array(0,0,0);
    if (
$s>240 || $s<0) return array(0,0,0);
    if (
$l>240 || $l<0) return array(0,0,0);    
    if (
$h<=40) {
       
$R=255;
       
$G=(int)($h/40*256);
       
$B=0;
    }
    elseif (
$h>40 && $h<=80) {
       
$R=(1-($h-40)/40)*256;
       
$G=255;
       
$B=0;
    }
    elseif (
$h>80 && $h<=120) {
       
$R=0;
       
$G=255;
       
$B=($h-80)/40*256;
    }
    elseif (
$h>120 && $h<=160) {
       
$R=0;
       
$G=(1-($h-120)/40)*256;
       
$B=255;
    }
    elseif (
$h>160 && $h<=200) {
       
$R=($h-160)/40*256;
       
$G=0;
       
$B=255;
    }
    elseif (
$h>200) {
       
$R=255;
       
$G=0;
       
$B=(1-($h-200)/40)*256;
    }
   
$R=$R+(240-$s)/240*(128-$R);
   
$G=$G+(240-$s)/240*(128-$G);
   
$B=$B+(240-$s)/240*(128-$B);
    if (
$l<120) {
       
$R=($R/120)*$l;
       
$G=($G/120)*$l;
       
$B=($B/120)*$l;
    }
    else {
       
$R=$l*((256-$R)/120)+2*$R-256;
       
$G=$l*((256-$G)/120)+2*$G-256;
       
$B=$l*((256-$B)/120)+2*$B-256;
    }
    if (
$R<0) $R=0;
    if (
$R>255) $R=255;
    if (
$G<0) $G=0;
    if (
$G>255) $G=255;
    if (
$B<0) $B=0;
    if (
$B>255) $B=255;
   
    return array((int)
$R,(int)$G,(int)$B);
}
?>
mv at brazil dot com
16-Mar-2005 01:04
<?php

/**
 * Create a image bar using lib GD
 * Ege. <img src="color_sample.php?color=FF0000" width="10 height="30">
 */

// Split the HTML color representation
$hexcolor = str_split($_GET["color"], 2);

// Convert HEX values to DECIMAL
$bincolor[0] = hexdec("0x{$hexcolor[0]}");
$bincolor[1] = hexdec("0x{$hexcolor[1]}");
$bincolor[2] = hexdec("0x{$hexcolor[2]}");

$im = ImageCreate(100, 100);
$colorallocate = ImageColorAllocate($im, $bincolor[0], $bincolor[1], $bincolor[2]);
ImageFilledRectangle($im, 0, 0, 100, 100, $colorallocate);
header('Content-Type: image/png');
ImagePNG($im);

?>
19-Jan-2005 03:53
When you are using truecolor images, you can also use bitwise operations to generate the color:
<?php
$color
= ($r << 16) | ($g << 8) | $b; // 2261213
?>
This is identical to the imagecolorallocate() function, in truecolor images!
aaron at parecki dot com
22-Dec-2004 03:40
This will let you tint an image to any specific color. The blacks of the source image become your specified color, and the whites remain white. Works best for colorizing greyscale images.

<?php

$r
= 224;
$g = 192;
$b = 0;
$source_file = "picture.jpg";

$im_src = ImageCreateFromJpeg($source_file);
$im_tint = ImageCreate(imagesx($im_src),imagesy($im_src));
for (
$c = 0; $c < 255; $c++) {
    
ImageColorAllocate($im_tint, max($r,$c), max($g,$c), max($b,$c));
}
ImageCopyMerge($im_tint,$im_src,0,0,0,0, imagesx($im_src), imagesy($im_src), 100);
ImageDestroy($im_src);

header("Content-type: image/jpeg");
imagejpeg($im_tint);

?>
tyberis
28-Nov-2004 06:28
2 functions to convert from HSV colorspace (hue/saturation/brightness) to RGB (red/green/blue) colorspace and back.
<?php
// $c = array($red, $green, $blue)
// $red=[0..1], $green=[0..1], $blue=[0..1];
function rgb2hsv($c) {
 list(
$r,$g,$b)=$c;
 
$v=max($r,$g,$b);
 
$t=min($r,$g,$b);
 
$s=($v==0)?0:($v-$t)/$v;
 if (
$s==0)
 
$h=-1;
 else {
 
$a=$v-$t;
 
$cr=($v-$r)/$a;
 
$cg=($v-$g)/$a;
 
$cb=($v-$b)/$a;
 
$h=($r==$v)?$cb-$cg:(($g==$v)?2+$cr-$cb:(($b==$v)?$h=4+$cg-$cr:0));
 
$h=60*$h;
 
$h=($h<0)?$h+360:$h;
 }
 return array(
$h,$s,$v);
}

// $c = array($hue, $saturation, $brightness)
// $hue=[0..360], $saturation=[0..1], $brightness=[0..1]
function hsv2rgb($c) {
 list(
$h,$s,$v)=$c;
 if (
$s==0)
  return array(
$v,$v,$v);
 else {
 
$h=($h%=360)/60;
 
$i=floor($h);
 
$f=$h-$i;
 
$q[0]=$q[1]=$v*(1-$s);
 
$q[2]=$v*(1-$s*(1-$f));
 
$q[3]=$q[4]=$v;
 
$q[5]=$v*(1-$s*$f);
 
//return(array($q[($i+4)%5],$q[($i+2)%5],$q[$i%5]));
 
return(array($q[($i+4)%6],$q[($i+2)%6],$q[$i%6])); //[1]
 
}
}
?>

[1] - EDITOR NOTE: THIS IS A FIX FROM "hc at hob(removethis)soft dot net".
smoli at paranoya dot ch
19-Jul-2004 11:40
Some of you maybe want to use HSV color model for drawing color selectors and circles:

<?php
 
function &colormap_hsv_to_rgb($h, $s, $v)
  {
   
$ret = new stdClass();

    if(
$s == 0)
    {
     
$ret->r = $v;
     
$ret->g = $v;
     
$ret->b = $v;

      return
$ret;
    }
    else
    {
     
$h = floatval($h) / 255.0;
     
$s = floatval($s) / 255.0;
     
$v = floatval($v) / 255.0;

     
$hue = $h;

      if(
$hue == 1.0)
       
$hue = 0.0;

     
$hue *= 6.0;

     
$i = intval($hue);
     
$f = $hue - floatval($i);
     
$w = $v * (1.0 - $s);
     
$q = $v * (1.0 - ($s * $f));
     
$t = $v * (1.0 - ($s * (1.0 - $f)));

      switch(
$i)
      {
         case
0: $ret->r = $v; $ret->g = $t; $ret->b = $w; break;
         case
1: $ret->r = $q; $ret->g = $v; $ret->b = $w; break;
         case
2: $ret->r = $w; $ret->g = $v; $ret->b = $t; break;
         case
3: $ret->r = $w; $ret->g = $q; $ret->b = $v; break;
         case
4: $ret->r = $t; $ret->g = $w; $ret->b = $v; break;
         case
5: $ret->r = $v; $ret->g = $w; $ret->b = $q; break;
      }
    }
   
   
$ret->r = intval($ret->r * 255.0);
   
$ret->g = intval($ret->g * 255.0);
   
$ret->b = intval($ret->b * 255.0);

    return
$ret;
  }
?>
jernberg at fairytale dot se
06-Mar-2004 12:13
this might help someone, how to allocate an color from an html color-definition:

<?php
$fg
= "#ff0080";

$red = 100;
$green = 100;
$blue = 100;
if(
eregi( "[#]?([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})", $fg, $ret ) )
{
   
$red = hexdec( $ret[1] );
   
$green = hexdec( $ret[2] );
   
$blue = hexdec( $ret[3] );
}

$text_color = ImageColorAllocate( $img1, $red, $green, $blue );
?>
chris at drunkenpirates dot co dot uk
14-Sep-2003 06:14
<?php

/*
An example combining the use of ImageColorAllocate, Imagesetpixel, Imagecopyresized and some basic Trig
*/

Header("Content-type: image/png");

$height = 128;
$width = 128;

$imA = ImageCreate($width, $height);
$imB = ImageCreate($width*4, $height*4);
$bckA = ImageColorAllocate($imA, 0,0,0);
$bckB = ImageColorAllocate($imB, 0,0,0);

//GENERATE GRAY SCALE PALLETE

for($c=0;$c<256;$c++){
               
ImageColorAllocate($imA, $c, $c, $c);
                }

//PRODUCE DATA

$m=rand(0,10);
for(
$c=0;$c<128;$c++){
               
$s=  (sin( deg2rad($c*360*$m/128) )+1)*127;
               
$col_arr[$c]=$s;
                }
for(
$y=0;$y<$height;$y++){
        for(
$x=0;$x<$width;$x++){
               
$imgA[$x][$y]=$col_arr[$x];
                }
        }
for(
$y=0;$y<$height;$y++){
        for(
$x=0;$x<$width;$x++){
               
$imgB[$x][$y]=$col_arr[$y];
                }
        }

//SET PIXELS

for($y=0;$y<$height;$y++){
        for(
$x=0;$x<$width;$x++){
               
$imgC[$x][$y]=$imgA[$x][$y]+$imgB[$x][$y];
               
$s=$imgC[$x][$y]/2;
               
Imagesetpixel($imA,$x,$y,$s);
                }
        }

//RESIZE IMAGE FOR DISPLAY

Imagecopyresized ($imB, $imA, <