Что такое код imagecolorallocate

imagecolorallocate

imagecolorallocate — Allocate a color for an image

Описание

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.

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

Список параметров

Ресурс изображения, полученный одной из функций создания изображений, например, такой как imagecreatetruecolor() .

Value of red component.

Value of green component.

Value of blue component.

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

Возвращаемые значения

A color identifier or FALSE if the allocation failed.

Эта функция может возвращать как boolean FALSE, так и не-boolean значение, которое приводится к FALSE, например, или «». За более подробной информации обратитесь к разделу Булев тип. Используйте оператор === для проверки значения, возвращаемого этой функцией.

Список изменений

Версия Описание
Prior to 5.1.3 Returns -1 if the allocation failed.

Примеры

Пример #1 imagecolorallocate() example

= imagecreate ( 100 , 100 );

// sets background to red
$background = imagecolorallocate ( $im , 255 , 0 , 0 );

// sets some colors
$white = imagecolorallocate ( $im , 255 , 255 , 255 );
$black = imagecolorallocate ( $im , 0 , 0 , 0 );

// hexadecimal way
$white = imagecolorallocate ( $im , 0xFF , 0xFF , 0xFF );
$black = imagecolorallocate ( $im , 0x00 , 0x00 , 0x00 );

Справочник по PHP : Графика : Работа с изображениями и библиотека GD : Работа с цветом в формате RGB

Материал из WebWikiABCD

Содержание

imageColorAllocate

Создание нового цвета и занесение его в палитру рисунка.

Функция возвращает идентификатор цвета, связанного с соответствующей тройкой RGB. Первым параметром функция требует идентификатор изображения, загруженного в память или созданного до этого.

Параметры red, green и blue задают красный, зеленый и синий компоненты цвета соответственно. Значения этих параметров должны лежать в пределах от 0 до 255, или от 0x00 до 0xFF.

Практически каждый цвет, который планируется в дальнейшем использовать, должен быть получен (определен) при помощи вызова этой функции.

Пример: Пример использования функции imageColorAllocate():

imageColorDeAllocate

Исключение цвета из палитры рисунка.

Эта функция удаляет из палитры рисунка im цвет color, который был предварительно занесен в рисунок функцией imageColorAllocate().

Пример: Пример использования функции imageColorDeAllocate():

imageColorSet

Замена цвета определенного элемента палитры.

Данная функция устанавливает для элемента палитры index рисунка im значения компонент цвета: red (красный), green (зеленый), blue (синий). При этом все части рисунка, закрашенные данным цветом, также изменят свой оттенок.

imageColorClosest

Получение цвета палитры, наиболее близкого к указанному.

Вместо того, чтобы пытаться выискать свободное место в палитре цветов, эта функция просто возвращает идентификатор цвета, уже существующего в рисунке и находящегося ближе всего к затребованному. Таким образом, нового цвета в палитру не добавляется. Если палитра не велика, то функция может вернуть не совсем тот цвет, который вы ожидаете. Например, в палитре из трех цветов «красный-зеленый-синий» на запрос желтого цвета будет, скорее всего, возвращен идентификатор зеленого — он ближе всего с точки зрения GD соответствует понятию «зеленый».

imageColorTransparent

Определение цвета прозрачности.

Эта функция указывает GD, что соответствующий цвет color (заданный своим идентификатором при помощи функции imageColorAllocate()) в изображении im (im — идентификатор изображения, заданный функцией imageCreate()) должен обозначиться как прозрачный. Возвращает идентификатор установленного до этого прозрачного цвета, либо false, если таковой не был определен ранее.

Надо отметить, что не все форматы поддерживают задание прозрачного цвета — например, JPEG не может его содержать.

imageColorsForIndex

Получение RGB-составляющих элемента палитры.

Функция возвращает ассоциативный массив с ключами red, green, blue (именно в таком порядке), которым соответствуют значения, равные величинам компонент RGB в идентификаторе цвета index. Но мы можем и не обращать особого внимания на ключи и преобразовать возвращенное значение как список:

imageColorAt

Возвращает индекс цвета точки.

Эта функция возвращает цвет точки, расположенной на координатах (x, y). Если PHP скомпилирован с GD library 2.0 или выше, а картинка — truecolor, то эта функция возвратит идентификатор цвета, а не его RGB-представление.

imageColorsTotal

Получение количества цветов в палитре.

Функция возвращает число цветов в палитре указанного изображения.

imageColorExact

Получение индекса цвета палитры.

Функция возвращает индекс указанного цвета (red, green, blue) в палитре изображения im.

Функция возвратит -1, если указанного цвета нет в палитре изображения.

imageColorResolve

Нахождение или создание указанного цвета.

Функция возвращает индекс указанного цвета (red, green, blue) в палитре изображения im.

В случае, если такой цвет в палитре отсутствует, то он создается.

imageGammaCorrect

Применение гамма-коррекции рисунка.

Эта функция производит исправления гаммы к изображению, заданному дескриптором im. Параметр inputgamma задает входную гамму, а outputgamma — гамму вывода.

PHP ImageColorAllocate возвращаемых значений

У меня есть следующий код для установки 2 цветов:

Однако $col[0] и $col[1] возвращают 0 и 1 соответственно, и вместо красного и зеленого я фактически получаю черно-белое. У меня такое впечатление, что они должны возвращать число для этого цвета, а не 1/0.

Кроме того, я могу изменить эти значения r/g/b почти на что угодно, но при этом получить те же возвращаемые значения.

Есть ли что-то еще, что мне нужно сделать?

1 ответ

imageColorAllocate возвращает color identifier или FALSE если выделение не удалось.

Ваш массив должен содержать ресурсы (идентификаторы), а не цвета как таковые.

это должно использовать идентификатор, чтобы нарисовать пиксель с вашим цветом.

Как я могу дать цвет ImageColorAllocate?

У меня есть переменная PHP, которая содержит информацию о цвете. Например $text_color = «ff90f3» . Теперь я хочу, чтобы дать этот цвет imagecolorallocate . imagecolorallocate работает так:

imagecolorallocate($im, 0xFF, 0xFF, 0xFF);

Таким образом, я пытаюсь сделать следующее:

Это не работает. Почему? Я стараюсь это также без BIN2HEX, он также не работает. Может кто-нибудь помочь мне с этим?

3 ответа

Возможно, для Вашего проекта будут необходимы бесплатные векторные карты. На нашем сайте представлены карты для всех стран.

Что такое код imagecolorallocate

(PHP 3, PHP 4 , PHP 5)

imagecolorallocate — Allocate a color for an image

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

Замечание: The first call to imagecolorallocate() fills the background color.

// sets background to red
$background = imagecolorallocate ( $im , 255 , 0 , 0 );

// sets some colors
$white = imagecolorallocate ( $im , 255 , 255 , 255 );
$black = imagecolorallocate ( $im , 0 , 0 , 0 );

// hexadecimal way
$white = imagecolorallocate ( $im , 0xFF , 0xFF , 0xFF );
$black = imagecolorallocate ( $im , 0x00 , 0x00 , 0x00 );

Returns -1 if the allocation failed.

/**
* Create a image bar using lib GD
* Ege.
*/

// 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 );

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.

= 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 );

Here is an easier way to set the color without use imagecolorallocate();

imagefill ( $image , 0 , 0 , 0xFFFFFF ); // white color (#FFFFFF)

?>

Use hexadecimal values just like you do in HTML codes:

0xFF0000 = red
0x00FF00 = green
0x0000FF = blue
0xFFFF00 = yellow

Hope this will help many people.

2 functions to convert from HSV colorspace (hue/saturation/brightness) to RGB (red/green/blue) colorspace and back.
// $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 ]));
>
>
?>

quote from «tim at phantomrpg dot com»

Here is a simpler way of using a hex color with ImageColorAllocate().
sscanf(«FFFF00», «%2x%2x%2x», $red, $green, $blue);
$stringColor=ImageColorAllocate($image,$red,$green,$blue);

I made it into a simple function:
function fromhex ( $string ) <
GLOBAL $image ;
sscanf ( $string , «%2x%2x%2x» , $red , $green , $blue );
return ImageColorAllocate ( $image , $red , $green , $blue );
>
//Example for calling a hex color:
ImageFill ( $image , 0 , 0 , fromhex ( ‘FFFFFF’ ));
?>

Some of you maybe want to use HSV color model for drawing color selectors and circles:

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 ;

if( $hue == 1.0 )
$hue = 0.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 );

Here is a simpler way of using a hex color with ImageColorAllocate().

sscanf(«FFFF00», «%2x%2x%2x», $red, $green, $blue);
$stringColor=ImageColorAllocate($image,$red,$green,$blue);

Hope it helps someone.

this might help someone, how to allocate an color from an html color-definition:

$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 );

/*
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 );
>

$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 ];
>
>

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 , 0 , 0 , 0 , 0 , $width * 4 , $height * 4 , $width , $width );
ImagePNG ( $imB );
?>

Doiveo’s suggestion for getting the font colors to behave with JPEG’s does (at least for PHP 4.1.2 — GD version 1) stop the problem (that I had) with fonts becoming outlined instead of solid, however the font colors were still incorrect.

There is however a much simpler (and faster) solution, just use imageColorClosest instead of imageColorAllocate, e.g:

$near_white = imageColorClosest($img, 255,255,255);
imageTTFtext($img, 10, 0, 20, 20, $near_white, «font file path», «text to add to JPEG»);

For most JPEG’s there should be a fairly close matching color to the one you want to use.

I was unable to get any of the posted methods for converting colour to grayscale to work. The problem appears to be the way gd creates images from jpeg inconsistently over various versions. Eventually I wrote my own that works for me — this approach allocates the 256 color pallete first. You can also play with separate $r, $g, $b variables before using imagecolorallocate in order to tone or tint the image.

= ‘whatever.jpg’ ;
$im_size = GetImageSize ( $resource );
$imageWidth = $im_size [ 0 ];
$imageHeight = $im_size [ 1 ];
$im = imageCreate ( $imageWidth , $imageHeight );
for ( $c = 0 ; $c 256 ; $c ++) <
ImageColorAllocate ( $im , $c , $c , $c );
>
$im2 = ImageCreateFromJpeg ( $resource );
ImageCopyMerge ( $im , $im2 , 0 , 0 , 0 , 0 , $imageWidth , $imageHeight , 100 );
ImageDestroy ( $im2 );
?>

go on using $im as your image, it is now grayscale .

a patch to php 4.3.0 to add imagecolorallocatealpha is here:

PHP ImageColorAllocate — назначить цветное изображение

ImageColorAllocate — назначить цвет изображения.

грамматика

ImageColorAllocate () возвращает идентификатор, представляющий цвет RGB от заданного состава компонентов. красный, зеленый и синий желаемый цвет красный, зеленый и синий компоненты. Эти параметры являются целыми числами 0-255 или шестнадцатеричное 0x00 до 0xFF. ImageColorAllocate () должен вызываться для создания каждого изображения, которое используется в изображении, представленном цветом.

Возвращает -1, если выделение не удается.

Примечание: В первый раз ImageColorAllocate () вызова на основе изображения будет заполнить фоновый цветовую палитру, которая использует ImageCreate () изображение , созданное.

примеров

Приведенный выше пример выходного изображения выглядит следующим образом:

Imagecolorallocate

Php функции


Php скрипты


imagecolorallocate

(PHP 3, PHP 4, PHP 5)

imagecolorallocate — Allocate a color for an image

Description

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

imagecolorallocate() returns a color identifier representing the color composed of the given RGB components. The image argument is the return from the imagecreatetruecolor() all.php?act=funct&argument= red , green and blue are the values of the red, green and blue component of the requested color respectively. These parameters are integers between 0 and 255 or hexadecimals between 0x00 and 0xFF. imagecolorallocate() must be called to create each color that is to be used in the image represented by image .

Замечание: The first call to imagecolorallocate() fills the background color.

$i m = imagecreatetruecolor ( ‘example.jpg’ );
// sets background to red
$b ackground = imagecolorallocate ( $i m , 255 , 0 , 0 );

// sets some colors
$w hite = imagecolorallocate ( $i m , 255 , 255 , 255 );
$b lack = imagecolorallocate ( $i m , 0 , 0 , 0 );

// hexadecimal way
$w hite = imagecolorallocate ( $i m , 0xFF , 0xFF , 0xFF );
$b lack = imagecolorallocate ( $i m , 0x00 , 0x00 , 0x00 );

Returns -1 if the allocation failed.

User Contributed Notes

This works! A Black-Image with vertical centered white Aliased Arial-Text and same left and right margin — used for Menu-Buttons.

function createImgText ( $s tring = «» , $f ontsize = 0 , $m arginX = 0 , $i m g H = 0 , $f ontfile = «» , $i m g C olorHex = «» , $t xtColorHex = «» ) <
if ( $s tring != «» ) <
Header ( «Content-type: image/png» );
//
$s pacing = 0 ;
$l ine = array ( «linespacing» => $s pacing );
$b ox = @imageftbbox ( $f ontsize , 0 , $f ontfile , $s tring , $l ine )
or die ( «ERROR» );
$t w = $b ox [ 4 ] — $b ox [ 0 ] ; //image width
$m arginY = $i m g H — (( $i m g H — $f ontsize ) / 2 );
$i m g Width = $t w + ( 2 * $m arginX );
$i m = ImageCreate ( $i m g Width , $i m g H );
$i nt = hexdec ( $i m g C olorHex );
$a rr = array ( «red» => 0xFF & ( $i nt >> 0x10 ),
«green» => 0xFF & ( $i nt >> 0x8 ),
«blue» => 0xFF & $i nt );
$b lack = ImageColorAllocate ( $i m , $a rr [ «red» ] , $a rr [ «green» ] , $a rr [ «blue» ] );
$i nt = hexdec ( $t xtColorHex );
$a rr = array ( «red» => 0xFF & ( $i nt >> 0x10 ),
«green» => 0xFF & ( $i nt >> 0x8 ),
«blue» => 0xFF & $i nt );
$w hite = ImageColorAllocate ( $i m , $a rr [ «red» ] , $a rr [ «green» ] , $a rr [ «blue» ] );
ImageFtText ( $i m , $f ontsize , 0 , $m arginX , $m arginY , $w hite , $f ontfile , $s tring , array ());
ImagePng ( $i m );
ImageDestroy ( $i m );
> else <
echo «ERROR!» ;
>
>
createImgText ( «Hello World» , 9 , 10 , 18 , «arial.ttf» , «000000» , «FFFFFF» );
?>

mlse
15-Nov-2005 12:49

Another more general variation on the theme using the same naming conventions as the hexdec and dechex built-in functions .

array hexrgb ( string hex_string )

An associative array of the RGB components specified in hex_string.

$r gb = hexrgb ( «0xAABBCC» );
print_r ( $r gb );
?>

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

function hexrgb ( $h ex str )
<
$i nt = hexdec ( $h ex str );

return array ( «red» => 0xFF & ( $i nt >> 0x10 ),
«green» => 0xFF & ( $i nt >> 0x8 ),
«blue» => 0xFF & $i nt );
>
?>

The output of hexdec can then be passed to imagecolorallocate and manipulated as required.
miked at m80im dot com
08-Nov-2005 04:40

improvement upon fromhex function by avi at amarcus dot com

function fromhex ( $s tring ,& $i m age ) <
sscanf ( $s tring , «%2x%2x%2x» , $r ed , $g reen , $b lue );
return ImageColorAllocate ( $i m age , $r ed , $g reen , $b lue );
>

//Example for calling a hex color:
ImageFill ( $i m age , 0 , 0 , fromhex ( ‘FFFFFF’ ));

?>

Zigbigidorlu at hotmail dot com
06-Oct-2005 11:05

Here’s a very simple and very effective code to change a HEX color to RGB.

function HEX2RGB( $c olor ) <
$c olor _array = array ();
$h ex _color = strtoupper ( $c olor );
for ( $i = 0; $i $i ++) <
$h ex = substr ( $h ex _color , $i ,1);
switch ( $h ex ) <
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 = $h ex ; break;
>
array_push ( $c olor _array , $num );
>
$R = (( $c olor _array [ 0 ] * 16) + $c olor _array [ 1 ] );
$G = (( $c olor _array [ 2 ] * 16) + $c olor _array [ 3 ] );
$B = (( $c olor _array [ 4 ] * 16) + $c olor _array [ 5 ] );
return array ( $R , $G , $B );
unset ( $c olor _array , $h ex , $R , $G , $B );
>

This nifty function will produce the negative of a given image!

Code by Kailash Nadh

function img2neg ( $pic ) <

header ( «Content-type: image/jpeg» );

$s ource = imagecreatefromjpeg ( $pic ); // Source
$w idth = imagesx ( $s ource ); $h eight = imagesy ( $s ource );

$i m = imagecreatetruecolor ( $w idth , $h eight ); // Our negative img in the making

for ( $y = 0 ; $y $h eight ; $y ++) <
for ( $x = 0 ; $x $w idth ; $x ++) <

$c olor s = imagecolorsforindex ( $s ource , imagecolorat ( $s ource , $x , $y ));

// this is what makes the colors negative
$r = 255 — $c olor s [ ‘red’ ] ;
$g = 255 — $c olor s [ ‘green’ ] ;
$b = 255 — $c olor s [ ‘blue’ ] ;
$t est = imagecolorallocate ( $i m , $r , $g , $b );
imagesetpixel ( $i m , $x , $y , $t est );
>
>

imagejpeg ( $i m );
imagedestroy ( $i m );
>

?>

andreoli dot carlo at libero dot it
08-Jun-2005 05:38

hsl to RGB
(not yet optimized but it function)

function hslToRgb ( $h , $s , $l ) <
if ( $h >240 || $h array (0,0,0);
if ( $s >240 || $s array (0,0,0);
if ( $l >240 || $l array (0,0,0);
if ( $h <
$R =255;
$G =( int )( $h /40*256);
$B =0;
>
elseif ( $h >40 && $h <
$R =(1-( $h -40)/40)*256;
$G =255;
$B =0;
>
elseif ( $h >80 && $h <
$R =0;
$G =255;
$B =( $h -80)/40*256;
>
elseif ( $h >120 && $h <
$R =0;
$G =(1-( $h -120)/40)*256;
$B =255;
>
elseif ( $h >160 && $h <
$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 <
$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 $R =0;
if ( $R >255) $R =255;
if ( $G $G =0;
if ( $G >255) $G =255;
if ( $B $B =0;
if ( $B >255) $B =255;

return array (( int ) $R ,( int ) $G ,( int ) $B );
>
mv at brazil dot com
15-Mar-2005 10:34

/**
* Create a image bar using lib GD
* Ege.
*/

// Split the HTML color representation
$h ex color = str_split ( $_GET [ «color» ] , 2 );

// Convert HEX values to DECIMAL
$b incolor [ 0 ] = hexdec ( «0x < $h ex color [ 0 ] >» );
$b incolor [ 1 ] = hexdec ( «0x < $h ex color [ 1 ] >» );
$b incolor [ 2 ] = hexdec ( «0x < $h ex color [ 2 ] >» );

$i m = ImageCreate ( 100 , 100 );
$c olor allocate = ImageColorAllocate ( $i m , $b incolor [ 0 ] , $b incolor [ 1 ] , $b incolor [ 2 ] );
ImageFilledRectangle ( $i m , 0 , 0 , 100 , 100 , $c olor allocate );
header ( ‘Content-Type: image/png’ );
ImagePNG ( $i m );

?>

bob at hotmail dot com
11-Mar-2005 02:24

The first color allocated will not fill the background if you use a true color image from imagecreatetruecolor().
19-Jan-2005 01:23

When you are using truecolor images, you can also use bitwise operations to generate the color:

$c olor = ( $r $g $b ; // 2261213
?>

This is identical to the imagecolorallocate() function, in truecolor images!
aaron at parecki dot com
22-Dec-2004 01:10

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.

$r = 224 ;
$g = 192 ;
$b = 0 ;
$s ource _file = «picture.jpg» ;

$i m _src = ImageCreateFromJpeg ( $s ource _file );
$i m _tint = ImageCreate ( imagesx ( $i m _src ), imagesy ( $i m _src ));
for ( $c = 0 ; $c $c ++) <
ImageColorAllocate ( $i m _tint , max ( $r , $c ), max ( $g , $c ), max ( $b , $c ));
>
ImageCopyMerge ( $i m _tint , $i m _src , 0 , 0 , 0 , 0 , imagesx ( $i m _src ), imagesy ( $i m _src ), 100 );
ImageDestroy ( $i m _src );

header ( «Content-type: image/jpeg» );
imagejpeg ( $i m _tint );

?>

carlosreche at yahoo dot com
13-Dec-2004 07:27

Here is an easier way to set the color without use imagecolorallocate();

$i m age = imagecreatetruecolor ();

imagefill ( $i m age , 0 , 0 , 0xFFFFFF ); // white color (#FFFFFF)

Use hexadecimal values just like you do in HTML codes:

0xFF0000 = red
0x00FF00 = green
0x0000FF = blue
0xFFFF00 = yellow

Hope this will help many people.

Carlos Reche
tyberis
28-Nov-2004 03:58

2 functions to convert from HSV colorspace (hue/saturation/brightness) to RGB (red/green/blue) colorspace and back.

// $c = array ( $r ed , $g reen , $b lue )
// $r ed = [ 0..1 ] , $g reen = [ 0..1 ] , $b lue = [ 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 ;
$c r =( $v — $r )/ $a ;
$c g =( $v — $g )/ $a ;
$c b =( $v — $b )/ $a ;
$h =( $r == $v )? $c b — $c g :(( $g == $v )? 2 + $c r — $c b :(( $b == $v )? $h = 4 + $c g — $c r : 0 ));
$h = 60 * $h ;
$h =( $h $h + 360 : $h ;
>
return array ( $h , $s , $v );
>

// $c = array ( $h ue , $s aturation , $b rightness )
// $h ue = [ 0..360 ] , $s aturation = [ 0..1 ] , $b rightness = [ 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 ] ));
>
>
?>

avi at amarcus dot com
20-Aug-2004 10:21

quote from «tim at phantomrpg dot com»

Here is a simpler way of using a hex color with ImageColorAllocate().
sscanf(«FFFF00», «%2x%2x%2x», $r ed , $g reen , $b lue );
$s tring Color =ImageColorAllocate( $i m age , $r ed , $g reen , $b lue );

I made it into a simple function:

function fromhex ( $s tring ) <
GLOBAL $i m age ;
sscanf ( $s tring , «%2x%2x%2x» , $r ed , $g reen , $b lue );
return ImageColorAllocate ( $i m age , $r ed , $g reen , $b lue );
>
//Example for calling a hex color:
ImageFill ( $i m age , 0 , 0 , fromhex ( ‘FFFFFF’ ));
?>

smoli at paranoya dot ch
19-Jul-2004 10:10

Some of you maybe want to use HSV color model for drawing color selectors and circles:

function & colormap_hsv_to_rgb ( $h , $s , $v )
<
$r et = new stdClass ();

if ( $s == 0 )
<
$r et -> r = $v ;
$r et -> g = $v ;
$r et -> b = $v ;

return $r et ;
>
else
<
$h = floatval ( $h ) / 255.0 ;
$s = floatval ( $s ) / 255.0 ;
$v = floatval ( $v ) / 255.0 ;

if ( $h ue == 1.0 )
$h ue = 0.0 ;

$i = intval ( $h ue );
$f = $h ue — 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 : $r et -> r = $v ; $r et -> g = $t ; $r et -> b = $w ; break;
case 1 : $r et -> r = $q ; $r et -> g = $v ; $r et -> b = $w ; break;
case 2 : $r et -> r = $w ; $r et -> g = $v ; $r et -> b = $t ; break;
case 3 : $r et -> r = $w ; $r et -> g = $q ; $r et -> b = $v ; break;
case 4 : $r et -> r = $t ; $r et -> g = $w ; $r et -> b = $v ; break;
case 5 : $r et -> r = $v ; $r et -> g = $w ; $r et -> b = $q ; break;
>
>

$r et -> r = intval ( $r et -> r * 255.0 );
$r et -> g = intval ( $r et -> g * 255.0 );
$r et -> b = intval ( $r et -> b * 255.0 );

return $r et ;
>
?>

tim at phantomrpg dot com
04-Apr-2004 02:38

Here is a simpler way of using a hex color with ImageColorAllocate().

sscanf(«FFFF00», «%2x%2x%2x», $r ed , $g reen , $b lue );
$s tring Color =ImageColorAllocate( $i m age , $r ed , $g reen , $b lue );

Hope it helps someone.
jernberg at fairytale dot se
05-Mar-2004 09:43

this might help someone, how to allocate an color from an html color-definition:

$r ed = 100;
$g reen = 100;
$b lue = 100;
if ( eregi ( » [ # ] ?( [ 0-9a-f ] < 2 >)( [ 0-9a-f ] < 2 >)( [ 0-9a-f ] < 2 >)», $f g , $r et ) )
<
$r ed = hexdec ( $r et [ 1 ] );
$g reen = hexdec ( $r et [ 2 ] );
$b lue = hexdec ( $r et [ 3 ] );
>

$t ext_color = ImageColorAllocate( $i m g 1 , $r ed , $g reen , $b lue );
chris at drunkenpirates dot co dot uk
14-Sep-2003 04:44

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

Header ( «Content-type: image/png» );

$h eight = 128 ;
$w idth = 128 ;

$i m A = ImageCreate ( $w idth , $h eight );
$i m B = ImageCreate ( $w idth * 4 , $h eight * 4 );
$b ckA = ImageColorAllocate ( $i m A , 0 , 0 , 0 );
$b ckB = ImageColorAllocate ( $i m B , 0 , 0 , 0 );

//GENERATE GRAY SCALE PALLETE

for ( $c = 0 ; $c $c ++) <
ImageColorAllocate ( $i m A , $c , $c , $c );
>

$m = rand ( 0 , 10 );
for ( $c = 0 ; $c $c ++) <
$s = ( sin ( deg2rad ( $c * 360 * $m / 128 ) )+ 1 )* 127 ;
$c ol_arr [ $c ] = $s ;
>
for ( $y = 0 ; $y $h eight ; $y ++) <
for ( $x = 0 ; $x $w idth ; $x ++) <
$i m g A [ $x ] [ $y ] = $c ol_arr [ $x ] ;
>
>
for ( $y = 0 ; $y $h eight ; $y ++) <
for ( $x = 0 ; $x $w idth ; $x ++) <
$i m g B [ $x ] [ $y ] = $c ol_arr [ $y ] ;
>
>

for ( $y = 0 ; $y $h eight ; $y ++) <
for ( $x = 0 ; $x $w idth ; $x ++) <
$i m g C [ $x ] [ $y ] = $i m g A [ $x ] [ $y ] + $i m g B [ $x ] [ $y ] ;
$s = $i m g C [ $x ] [ $y ] / 2 ;
Imagesetpixel ( $i m A , $x , $y , $s );
>
>

//RESIZE IMAGE FOR DISPLAY

Imagecopyresized ( $i m B , $i m A , 0 , 0 , 0 , 0 , $w idth * 4 , $h eight * 4 , $w idth , $w idth );
ImagePNG ( $i m B );
?>

BruceB
19-May-2003 08:39

Doiveo’s suggestion for getting the font colors to behave with JPEG’s does (at least for PHP 4.1.2 — GD version 1) stop the problem (that I had) with fonts becoming outlined instead of solid, however the font colors were still incorrect.

There is however a much simpler (and faster) solution, just use imageColorClosest instead of imageColorAllocate, e.g:

$near_white = imageColorClosest( $i m g , 255,255,255);
imageTTFtext ( $i m g , 10, 0, 20, 20, $near_white , «font file path», «text to add to JPEG»);

For most JPEG’s there should be a fairly close matching color to the one you want to use.
leif at harmsen dot net
16-Apr-2003 06:31

I was unable to get any of the posted methods for converting colour to grayscale to work. The problem appears to be the way gd creates images from jpeg inconsistently over various versions. Eventually I wrote my own that works for me — this approach allocates the 256 color pallete first. You can also play with separate $r , $g , $b variables before using imagecolorallocate in order to tone or tint the image.

$r esource = ‘whatever.jpg’ ;
$i m _size = GetImageSize ( $r esource );
$i m age Width = $i m _size [ 0 ] ;
$i m age Height = $i m _size [ 1 ] ;
$i m = imageCreate ( $i m age Width , $i m age Height );
for ( $c = 0 ; $c $c ++) <
ImageColorAllocate ( $i m , $c , $c , $c );
>
$i m 2 = ImageCreateFromJpeg ( $r esource );
ImageCopyMerge ( $i m , $i m 2 , 0 , 0 , 0 , 0 , $i m age Width , $i m age Height , 100 );
ImageDestroy ( $i m 2 );
?>

go on using $i m as your image, it is now grayscale .
jasper at pointless dot net
21-Jan-2003 04:20

a patch to php 4.3.0 to add imagecolorallocatealpha is here:

cd php-4.3.0/ext/gd
patch bisqwit at iki dot fi
17-Feb-2002 07:30

Actually, you can’t allocate more than 256 colours for an paletted image ( ImageCreate ).
Use ImageCreateTrueColor instead. For it to work, you need libgd version 2 support in php though.
bisqwit at iki dot fi
17-Feb-2002 12:20

Looks like this function only allows allocating of 256 distinct colours.

So this code:
$i m = ImageCreate ( 500 , 200 );
for ( $a = 0 ; $a $a ++)
<
$c = 128 + sin ( $a ) * 127 ;
ImageLine ( $i m , $a , 0 , $a , 199 , ImageColorAllocate ( $i m , $c , $c , $c ));
>
ob_start ();
ImageJpeg ( $i m , » , 75 );
$s = ob_get_contents ();
ob_end_clean ();

header ( ‘Content-type: image/jpeg’ );
header ( ‘Content-length: ‘ . strlen ( $s ));
print $s ;

will make an image that has changing colours at
the first 256 pixel columns only . The rest are gray .
doiveo at hotmail dot nospam
12-Jan-2002 09:17

This will help anyone trying to control font colors in a JPEG. You have to create a temporary image first, allocate the colors then merge the images before it works. Go figure.

$i m _size = GetImageSize ( «MySource.jpg» );
$i m age Width = $i m _size [ 0 ] ;
$i m age Height = $i m _size [ 1 ] ;

$i m = imageCreate ( $i m age Width , $i m age Height );

// — or with GD 2+ —
// $i m = imageCreateTrueColor( $i m age Width , $i m age Height );

// do all your color allocations here
$f ont_color_black = ImageColorAllocate( $i m , 0,0,0);

$i m 2 = ImageCreateFromJPEG(«MySource.jpg»);

ImageCopy ( $i m , $i m 2 ,0,0,0,0, $i m age Width , $i m age Height );
ImageDestroy ( $i m 2 );

. finish as you please using the $i m var.

Что такое код imagecolorallocate

Логика работы с графикой проста. Есть html-страница, в которой надо вывести картинку. Пусть саму картинку генерирует скрипт, находящийся в файле image.php. В основном html-файле тогда будет написано что-то типа этого:

Здесь мы передаем в скрипт, генерирующий картинку (в примере будет серый прямоугольник), RGB-палитру цвета формируемого прямоугольника (напомню, что эти переменные, передаваемые в скрипт как параметры, будут в нем видны так, как если бы они были в нем объявлены и проинициализированы передаваемыми в вызывающем скрипте параметрами, т.е. для их использования ничего делать не надо!).

В image.php будет такой код:

Комментарии здесь следующие. Первое — в файле image.php перед тегом, открывающим php-секцию, не должно быть ни одного символа (даже пробелов!). До функции HEADER() также не должно быть ни одного оператора ECHO или PRINT. Файл не должен начинаться с декларации html ( ).

Это важно потому, что при появлении символов на вывод web-сервер прекращает формирование HTTP-заголовка и переходит к формированию секции данных (например, собственно html-страницы). А функция HEADER() как раз и добавляет/заменяет секцию заголовка (в данном случае, отвечающую за тип данных).
Кстати, «обойти» это ограничение можно буферизацией вывода. Т.е. это не обход, а организация выполнения скрипта — до окончания формирования HTTP-заголовка выводимая информация помещается в буфер, а потом буфер сбрасывается в выходной поток. В PHP есть для этого соответствующие функции.

Функция IMAGECREATE() создает image размера, указанного в параметрах функции: ширина и высота. Возвращаемое значение — целое, являющееся идентификатором ресурса image.

IMAGECOLORALLOCATE() возвращает идентификатор цвета, формируемого на основе RGB-значений (2..4 параметры; первый параметр — идентификатор image-ресурса).

IMAGEJPEG() формирует картинку (в данном случае, jpeg-формата) для передачи сервером клиентскому браузеру. Всего такого рода функций три. Кроме указанной для jpeg-формата есть еще IMAGEPNG() и IMAGEGIF() для png- и gif-форматов соответственно (формально, а на самом деле gif-ы, как я уже говорил, не поддерживаются, так что всего функций, формирующих картинки, две).

IMAGEDESTROY() освобождает память, выделенную функцией IMAGECREATE() под image. Единственный параметр — идентификатор image-ресурса.

Фоном картинки становится первый созданный после создания image цвет. А как сделать фон картинки прозрачным? Очень просто. Для этого есть функция IMAGECOLORTRANSPARENT(), ставящая для указанного цвета в указанной картинке атрибут transparent. Первый параметр этой функции — идентификатор image-ресурса, а второй (необязательный) — идентификатор созданного цвета, например:

Вообще говоря, идентификаторы создаваемых цветов представляют из себя, как я понял, целые числа, начинающиеся с нуля (первый вызов IMAGECOLORALLOCATE()) и увеличивающиеся на единицу при каждом последующем вызове функции создания цвета. Явного указания на этот факт в мануале я, правда, не нашел (не туда смотрел?).

P.S. Кстати, если у Вас картинка все же не формируется, проверьте синтаксис. В случае ошибок PHP выводит в выходной поток (сервер отдаст этот вывод браузеру) сообщение об ошибке (если в php.ini параметр «error_reporting» выставлен в «on»). Причем выводит до выполнения скрипта, т.е. на этапе компиляции, а не выполнения, а значит, до выполнения функции HEADER() — см. выше.

Если же в php.ini параметр «display_errors» вместо умолчательного значения «E_ALL &

E_NOTICE» будет равен, скажем, «E_ALL» (т.е. выводить все сообщения, включая предупреждения), то остаться без картинки можно, например, использовав необъявленную переменую.

PHP ImageColorAllocate возвращаемых значений

У меня есть следующий код для установки 2 цветов:

Однако $col[0] и $col[1] возвращают 0 и 1 соответственно, и вместо красного и зеленого я фактически получаю черно-белое. У меня такое впечатление, что они должны возвращать число для этого цвета, а не 1/0.

Кроме того, я могу изменить эти значения r/g/b почти на что угодно, но при этом получить те же возвращаемые значения.

Есть ли что-то еще, что мне нужно сделать?

1 ответ

imageColorAllocate возвращает color identifier или FALSE если выделение не удалось.

Ваш массив должен содержать ресурсы (идентификаторы), а не цвета как таковые.

это должно использовать идентификатор, чтобы нарисовать пиксель с вашим цветом.

Imagecolorallocate

Php функции


Php скрипты


imagecolorallocate

(PHP 3, PHP 4, PHP 5)

imagecolorallocate — Allocate a color for an image

Description

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

imagecolorallocate() returns a color identifier representing the color composed of the given RGB components. The image argument is the return from the imagecreatetruecolor() all.php?act=funct&argument= red , green and blue are the values of the red, green and blue component of the requested color respectively. These parameters are integers between 0 and 255 or hexadecimals between 0x00 and 0xFF. imagecolorallocate() must be called to create each color that is to be used in the image represented by image .

Замечание: The first call to imagecolorallocate() fills the background color.

$i m = imagecreatetruecolor ( ‘example.jpg’ );
// sets background to red
$b ackground = imagecolorallocate ( $i m , 255 , 0 , 0 );

// sets some colors
$w hite = imagecolorallocate ( $i m , 255 , 255 , 255 );
$b lack = imagecolorallocate ( $i m , 0 , 0 , 0 );

// hexadecimal way
$w hite = imagecolorallocate ( $i m , 0xFF , 0xFF , 0xFF );
$b lack = imagecolorallocate ( $i m , 0x00 , 0x00 , 0x00 );

Returns -1 if the allocation failed.

User Contributed Notes

This works! A Black-Image with vertical centered white Aliased Arial-Text and same left and right margin — used for Menu-Buttons.

function createImgText ( $s tring = «» , $f ontsize = 0 , $m arginX = 0 , $i m g H = 0 , $f ontfile = «» , $i m g C olorHex = «» , $t xtColorHex = «» ) <
if ( $s tring != «» ) <
Header ( «Content-type: image/png» );
//
$s pacing = 0 ;
$l ine = array ( «linespacing» => $s pacing );
$b ox = @imageftbbox ( $f ontsize , 0 , $f ontfile , $s tring , $l ine )
or die ( «ERROR» );
$t w = $b ox [ 4 ] — $b ox [ 0 ] ; //image width
$m arginY = $i m g H — (( $i m g H — $f ontsize ) / 2 );
$i m g Width = $t w + ( 2 * $m arginX );
$i m = ImageCreate ( $i m g Width , $i m g H );
$i nt = hexdec ( $i m g C olorHex );
$a rr = array ( «red» => 0xFF & ( $i nt >> 0x10 ),
«green» => 0xFF & ( $i nt >> 0x8 ),
«blue» => 0xFF & $i nt );
$b lack = ImageColorAllocate ( $i m , $a rr [ «red» ] , $a rr [ «green» ] , $a rr [ «blue» ] );
$i nt = hexdec ( $t xtColorHex );
$a rr = array ( «red» => 0xFF & ( $i nt >> 0x10 ),
«green» => 0xFF & ( $i nt >> 0x8 ),
«blue» => 0xFF & $i nt );
$w hite = ImageColorAllocate ( $i m , $a rr [ «red» ] , $a rr [ «green» ] , $a rr [ «blue» ] );
ImageFtText ( $i m , $f ontsize , 0 , $m arginX , $m arginY , $w hite , $f ontfile , $s tring , array ());
ImagePng ( $i m );
ImageDestroy ( $i m );
> else <
echo «ERROR!» ;
>
>
createImgText ( «Hello World» , 9 , 10 , 18 , «arial.ttf» , «000000» , «FFFFFF» );
?>

mlse
15-Nov-2005 12:49

Another more general variation on the theme using the same naming conventions as the hexdec and dechex built-in functions .

array hexrgb ( string hex_string )

An associative array of the RGB components specified in hex_string.

$r gb = hexrgb ( «0xAABBCC» );
print_r ( $r gb );
?>

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

function hexrgb ( $h ex str )
<
$i nt = hexdec ( $h ex str );

return array ( «red» => 0xFF & ( $i nt >> 0x10 ),
«green» => 0xFF & ( $i nt >> 0x8 ),
«blue» => 0xFF & $i nt );
>
?>

The output of hexdec can then be passed to imagecolorallocate and manipulated as required.
miked at m80im dot com
08-Nov-2005 04:40

improvement upon fromhex function by avi at amarcus dot com

function fromhex ( $s tring ,& $i m age ) <
sscanf ( $s tring , «%2x%2x%2x» , $r ed , $g reen , $b lue );
return ImageColorAllocate ( $i m age , $r ed , $g reen , $b lue );
>

//Example for calling a hex color:
ImageFill ( $i m age , 0 , 0 , fromhex ( ‘FFFFFF’ ));

?>

Zigbigidorlu at hotmail dot com
06-Oct-2005 11:05

Here’s a very simple and very effective code to change a HEX color to RGB.

function HEX2RGB( $c olor ) <
$c olor _array = array ();
$h ex _color = strtoupper ( $c olor );
for ( $i = 0; $i $i ++) <
$h ex = substr ( $h ex _color , $i ,1);
switch ( $h ex ) <
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 = $h ex ; break;
>
array_push ( $c olor _array , $num );
>
$R = (( $c olor _array [ 0 ] * 16) + $c olor _array [ 1 ] );
$G = (( $c olor _array [ 2 ] * 16) + $c olor _array [ 3 ] );
$B = (( $c olor _array [ 4 ] * 16) + $c olor _array [ 5 ] );
return array ( $R , $G , $B );
unset ( $c olor _array , $h ex , $R , $G , $B );
>

This nifty function will produce the negative of a given image!

Code by Kailash Nadh

function img2neg ( $pic ) <

header ( «Content-type: image/jpeg» );

$s ource = imagecreatefromjpeg ( $pic ); // Source
$w idth = imagesx ( $s ource ); $h eight = imagesy ( $s ource );

$i m = imagecreatetruecolor ( $w idth , $h eight ); // Our negative img in the making

for ( $y = 0 ; $y $h eight ; $y ++) <
for ( $x = 0 ; $x $w idth ; $x ++) <

$c olor s = imagecolorsforindex ( $s ource , imagecolorat ( $s ource , $x , $y ));

// this is what makes the colors negative
$r = 255 — $c olor s [ ‘red’ ] ;
$g = 255 — $c olor s [ ‘green’ ] ;
$b = 255 — $c olor s [ ‘blue’ ] ;
$t est = imagecolorallocate ( $i m , $r , $g , $b );
imagesetpixel ( $i m , $x , $y , $t est );
>
>

imagejpeg ( $i m );
imagedestroy ( $i m );
>

?>

andreoli dot carlo at libero dot it
08-Jun-2005 05:38

hsl to RGB
(not yet optimized but it function)

function hslToRgb ( $h , $s , $l ) <
if ( $h >240 || $h array (0,0,0);
if ( $s >240 || $s array (0,0,0);
if ( $l >240 || $l array (0,0,0);
if ( $h <
$R =255;
$G =( int )( $h /40*256);
$B =0;
>
elseif ( $h >40 && $h <
$R =(1-( $h -40)/40)*256;
$G =255;
$B =0;
>
elseif ( $h >80 && $h <
$R =0;
$G =255;
$B =( $h -80)/40*256;
>
elseif ( $h >120 && $h <
$R =0;
$G =(1-( $h -120)/40)*256;
$B =255;
>
elseif ( $h >160 && $h <
$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 <
$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 $R =0;
if ( $R >255) $R =255;
if ( $G $G =0;
if ( $G >255) $G =255;
if ( $B $B =0;
if ( $B >255) $B =255;

return array (( int ) $R ,( int ) $G ,( int ) $B );
>
mv at brazil dot com
15-Mar-2005 10:34

/**
* Create a image bar using lib GD
* Ege.
*/

// Split the HTML color representation
$h ex color = str_split ( $_GET [ «color» ] , 2 );

// Convert HEX values to DECIMAL
$b incolor [ 0 ] = hexdec ( «0x < $h ex color [ 0 ] >» );
$b incolor [ 1 ] = hexdec ( «0x < $h ex color [ 1 ] >» );
$b incolor [ 2 ] = hexdec ( «0x < $h ex color [ 2 ] >» );

$i m = ImageCreate ( 100 , 100 );
$c olor allocate = ImageColorAllocate ( $i m , $b incolor [ 0 ] , $b incolor [ 1 ] , $b incolor [ 2 ] );
ImageFilledRectangle ( $i m , 0 , 0 , 100 , 100 , $c olor allocate );
header ( ‘Content-Type: image/png’ );
ImagePNG ( $i m );

?>

bob at hotmail dot com
11-Mar-2005 02:24

The first color allocated will not fill the background if you use a true color image from imagecreatetruecolor().
19-Jan-2005 01:23

When you are using truecolor images, you can also use bitwise operations to generate the color:

$c olor = ( $r $g $b ; // 2261213
?>

This is identical to the imagecolorallocate() function, in truecolor images!
aaron at parecki dot com
22-Dec-2004 01:10

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.

$r = 224 ;
$g = 192 ;
$b = 0 ;
$s ource _file = «picture.jpg» ;

$i m _src = ImageCreateFromJpeg ( $s ource _file );
$i m _tint = ImageCreate ( imagesx ( $i m _src ), imagesy ( $i m _src ));
for ( $c = 0 ; $c $c ++) <
ImageColorAllocate ( $i m _tint , max ( $r , $c ), max ( $g , $c ), max ( $b , $c ));
>
ImageCopyMerge ( $i m _tint , $i m _src , 0 , 0 , 0 , 0 , imagesx ( $i m _src ), imagesy ( $i m _src ), 100 );
ImageDestroy ( $i m _src );

header ( «Content-type: image/jpeg» );
imagejpeg ( $i m _tint );

?>

carlosreche at yahoo dot com
13-Dec-2004 07:27

Here is an easier way to set the color without use imagecolorallocate();

$i m age = imagecreatetruecolor ();

imagefill ( $i m age , 0 , 0 , 0xFFFFFF ); // white color (#FFFFFF)

Use hexadecimal values just like you do in HTML codes:

0xFF0000 = red
0x00FF00 = green
0x0000FF = blue
0xFFFF00 = yellow

Hope this will help many people.

Carlos Reche
tyberis
28-Nov-2004 03:58

2 functions to convert from HSV colorspace (hue/saturation/brightness) to RGB (red/green/blue) colorspace and back.

// $c = array ( $r ed , $g reen , $b lue )
// $r ed = [ 0..1 ] , $g reen = [ 0..1 ] , $b lue = [ 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 ;
$c r =( $v — $r )/ $a ;
$c g =( $v — $g )/ $a ;
$c b =( $v — $b )/ $a ;
$h =( $r == $v )? $c b — $c g :(( $g == $v )? 2 + $c r — $c b :(( $b == $v )? $h = 4 + $c g — $c r : 0 ));
$h = 60 * $h ;
$h =( $h $h + 360 : $h ;
>
return array ( $h , $s , $v );
>

// $c = array ( $h ue , $s aturation , $b rightness )
// $h ue = [ 0..360 ] , $s aturation = [ 0..1 ] , $b rightness = [ 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 ] ));
>
>
?>

avi at amarcus dot com
20-Aug-2004 10:21

quote from «tim at phantomrpg dot com»

Here is a simpler way of using a hex color with ImageColorAllocate().
sscanf(«FFFF00», «%2x%2x%2x», $r ed , $g reen , $b lue );
$s tring Color =ImageColorAllocate( $i m age , $r ed , $g reen , $b lue );

I made it into a simple function:

function fromhex ( $s tring ) <
GLOBAL $i m age ;
sscanf ( $s tring , «%2x%2x%2x» , $r ed , $g reen , $b lue );
return ImageColorAllocate ( $i m age , $r ed , $g reen , $b lue );
>
//Example for calling a hex color:
ImageFill ( $i m age , 0 , 0 , fromhex ( ‘FFFFFF’ ));
?>

smoli at paranoya dot ch
19-Jul-2004 10:10

Some of you maybe want to use HSV color model for drawing color selectors and circles:

function & colormap_hsv_to_rgb ( $h , $s , $v )
<
$r et = new stdClass ();

if ( $s == 0 )
<
$r et -> r = $v ;
$r et -> g = $v ;
$r et -> b = $v ;

return $r et ;
>
else
<
$h = floatval ( $h ) / 255.0 ;
$s = floatval ( $s ) / 255.0 ;
$v = floatval ( $v ) / 255.0 ;

if ( $h ue == 1.0 )
$h ue = 0.0 ;

$i = intval ( $h ue );
$f = $h ue — 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 : $r et -> r = $v ; $r et -> g = $t ; $r et -> b = $w ; break;
case 1 : $r et -> r = $q ; $r et -> g = $v ; $r et -> b = $w ; break;
case 2 : $r et -> r = $w ; $r et -> g = $v ; $r et -> b = $t ; break;
case 3 : $r et -> r = $w ; $r et -> g = $q ; $r et -> b = $v ; break;
case 4 : $r et -> r = $t ; $r et -> g = $w ; $r et -> b = $v ; break;
case 5 : $r et -> r = $v ; $r et -> g = $w ; $r et -> b = $q ; break;
>
>

$r et -> r = intval ( $r et -> r * 255.0 );
$r et -> g = intval ( $r et -> g * 255.0 );
$r et -> b = intval ( $r et -> b * 255.0 );

return $r et ;
>
?>

tim at phantomrpg dot com
04-Apr-2004 02:38

Here is a simpler way of using a hex color with ImageColorAllocate().

sscanf(«FFFF00», «%2x%2x%2x», $r ed , $g reen , $b lue );
$s tring Color =ImageColorAllocate( $i m age , $r ed , $g reen , $b lue );

Hope it helps someone.
jernberg at fairytale dot se
05-Mar-2004 09:43

this might help someone, how to allocate an color from an html color-definition:

$r ed = 100;
$g reen = 100;
$b lue = 100;
if ( eregi ( » [ # ] ?( [ 0-9a-f ] < 2 >)( [ 0-9a-f ] < 2 >)( [ 0-9a-f ] < 2 >)», $f g , $r et ) )
<
$r ed = hexdec ( $r et [ 1 ] );
$g reen = hexdec ( $r et [ 2 ] );
$b lue = hexdec ( $r et [ 3 ] );
>

$t ext_color = ImageColorAllocate( $i m g 1 , $r ed , $g reen , $b lue );
chris at drunkenpirates dot co dot uk
14-Sep-2003 04:44

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

Header ( «Content-type: image/png» );

$h eight = 128 ;
$w idth = 128 ;

$i m A = ImageCreate ( $w idth , $h eight );
$i m B = ImageCreate ( $w idth * 4 , $h eight * 4 );
$b ckA = ImageColorAllocate ( $i m A , 0 , 0 , 0 );
$b ckB = ImageColorAllocate ( $i m B , 0 , 0 , 0 );

//GENERATE GRAY SCALE PALLETE

for ( $c = 0 ; $c $c ++) <
ImageColorAllocate ( $i m A , $c , $c , $c );
>

$m = rand ( 0 , 10 );
for ( $c = 0 ; $c $c ++) <
$s = ( sin ( deg2rad ( $c * 360 * $m / 128 ) )+ 1 )* 127 ;
$c ol_arr [ $c ] = $s ;
>
for ( $y = 0 ; $y $h eight ; $y ++) <
for ( $x = 0 ; $x $w idth ; $x ++) <
$i m g A [ $x ] [ $y ] = $c ol_arr [ $x ] ;
>
>
for ( $y = 0 ; $y $h eight ; $y ++) <
for ( $x = 0 ; $x $w idth ; $x ++) <
$i m g B [ $x ] [ $y ] = $c ol_arr [ $y ] ;
>
>

for ( $y = 0 ; $y $h eight ; $y ++) <
for ( $x = 0 ; $x $w idth ; $x ++) <
$i m g C [ $x ] [ $y ] = $i m g A [ $x ] [ $y ] + $i m g B [ $x ] [ $y ] ;
$s = $i m g C [ $x ] [ $y ] / 2 ;
Imagesetpixel ( $i m A , $x , $y , $s );
>
>

//RESIZE IMAGE FOR DISPLAY

Imagecopyresized ( $i m B , $i m A , 0 , 0 , 0 , 0 , $w idth * 4 , $h eight * 4 , $w idth , $w idth );
ImagePNG ( $i m B );
?>

BruceB
19-May-2003 08:39

Doiveo’s suggestion for getting the font colors to behave with JPEG’s does (at least for PHP 4.1.2 — GD version 1) stop the problem (that I had) with fonts becoming outlined instead of solid, however the font colors were still incorrect.

There is however a much simpler (and faster) solution, just use imageColorClosest instead of imageColorAllocate, e.g:

$near_white = imageColorClosest( $i m g , 255,255,255);
imageTTFtext ( $i m g , 10, 0, 20, 20, $near_white , «font file path», «text to add to JPEG»);

For most JPEG’s there should be a fairly close matching color to the one you want to use.
leif at harmsen dot net
16-Apr-2003 06:31

I was unable to get any of the posted methods for converting colour to grayscale to work. The problem appears to be the way gd creates images from jpeg inconsistently over various versions. Eventually I wrote my own that works for me — this approach allocates the 256 color pallete first. You can also play with separate $r , $g , $b variables before using imagecolorallocate in order to tone or tint the image.

$r esource = ‘whatever.jpg’ ;
$i m _size = GetImageSize ( $r esource );
$i m age Width = $i m _size [ 0 ] ;
$i m age Height = $i m _size [ 1 ] ;
$i m = imageCreate ( $i m age Width , $i m age Height );
for ( $c = 0 ; $c $c ++) <
ImageColorAllocate ( $i m , $c , $c , $c );
>
$i m 2 = ImageCreateFromJpeg ( $r esource );
ImageCopyMerge ( $i m , $i m 2 , 0 , 0 , 0 , 0 , $i m age Width , $i m age Height , 100 );
ImageDestroy ( $i m 2 );
?>

go on using $i m as your image, it is now grayscale .
jasper at pointless dot net
21-Jan-2003 04:20

a patch to php 4.3.0 to add imagecolorallocatealpha is here:

cd php-4.3.0/ext/gd
patch bisqwit at iki dot fi
17-Feb-2002 07:30

Actually, you can’t allocate more than 256 colours for an paletted image ( ImageCreate ).
Use ImageCreateTrueColor instead. For it to work, you need libgd version 2 support in php though.
bisqwit at iki dot fi
17-Feb-2002 12:20

Looks like this function only allows allocating of 256 distinct colours.

So this code:
$i m = ImageCreate ( 500 , 200 );
for ( $a = 0 ; $a $a ++)
<
$c = 128 + sin ( $a ) * 127 ;
ImageLine ( $i m , $a , 0 , $a , 199 , ImageColorAllocate ( $i m , $c , $c , $c ));
>
ob_start ();
ImageJpeg ( $i m , » , 75 );
$s = ob_get_contents ();
ob_end_clean ();

header ( ‘Content-type: image/jpeg’ );
header ( ‘Content-length: ‘ . strlen ( $s ));
print $s ;

will make an image that has changing colours at
the first 256 pixel columns only . The rest are gray .
doiveo at hotmail dot nospam
12-Jan-2002 09:17

This will help anyone trying to control font colors in a JPEG. You have to create a temporary image first, allocate the colors then merge the images before it works. Go figure.

$i m _size = GetImageSize ( «MySource.jpg» );
$i m age Width = $i m _size [ 0 ] ;
$i m age Height = $i m _size [ 1 ] ;

$i m = imageCreate ( $i m age Width , $i m age Height );

// — or with GD 2+ —
// $i m = imageCreateTrueColor( $i m age Width , $i m age Height );

// do all your color allocations here
$f ont_color_black = ImageColorAllocate( $i m , 0,0,0);

$i m 2 = ImageCreateFromJPEG(«MySource.jpg»);

ImageCopy ( $i m , $i m 2 ,0,0,0,0, $i m age Width , $i m age Height );
ImageDestroy ( $i m 2 );

. finish as you please using the $i m var.

Илон Маск рекомендует:  Iis о планировании пропускной способности
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL