imagecolorset

(PHP 4, PHP 5, PHP 7, PHP 8)

imagecolorset指定したパレットインデックスの色を設定する

説明

imagecolorset(
    GdImage $image,
    int $color,
    int $red,
    int $green,
    int $blue,
    int $alpha = 0
): ?false

この関数は、パレット上で指定したインデックス index を 指定した色 color に設定します。 実際にぬりつぶしを実行するオーバーヘッドなしに パレット上の色を使用する画像をぬりつぶしたような効果を得る ことができ、便利です。

パラメータ

image

imagecreatetruecolor()のような画像作成関数が返す GdImage オブジェクト。

color

パレットのインデックス。

red

赤コンポーネントの値。

green

緑コンポーネントの値。

blue

青コンポーネントの値。

alpha

アルファコンポーネントの値。

戻り値

この関数は、成功時に null を返します。 失敗した場合に false を返します

変更履歴

バージョン 説明
8.0.0 image は、 GdImage クラスのインスタンスを期待するようになりました。 これより前のバージョンでは、有効な gd resource が期待されていました。

例1 imagecolorset() の例

<?php
// 300x100 の画像を作成します
$im = imagecreate(300, 100);

// 背景色を赤に設定します
imagecolorallocate($im, 255, 0, 0);

// 背景の色インデックスを取得します
$bg = imagecolorat($im, 0, 0);

// 背景色を青に設定します
imagecolorset($im, $bg, 0, 0, 255);

// 画像をブラウザに出力します
header('Content-Type: image/png');

imagepng($im);
imagedestroy($im);
?>

参考

  • imagecolorat() - ピクセルの色のインデックスを取得する
add a note add a note

User Contributed Notes 10 notes

up
4
moxleystratton.com
18 years ago
If you want to convert a Color image to Grayscale without creating a blotchy image, use this color calculation:
<?php
function imagetograyscale($im)
{
    if (
imageistruecolor($im)) {
       
imagetruecolortopalette($im, false, 256);
    }

    for (
$c = 0; $c < imagecolorstotal($im); $c++) {
       
$col = imagecolorsforindex($im, $c);
       
$gray = round(0.299 * $col['red'] + 0.587 * $col['green'] + 0.114 * $col['blue']);
       
imagecolorset($im, $c, $gray, $gray, $gray);
    }
}
?>
up
3
heavyraptor2 at hotmail dot com
16 years ago
I've been looking for a simple function which "colorizes" an image, without any success ... it looks like a lot of people mean something different with "colorizing" an image, because actually colorzing means multiplying the old color's grayscale with the new color. So a white pixel would become 100% of the colorize-to-color and a black pixel would stay black (I know I can't explain well ... I hope you understood, otherwise take a look at the example below the functions' code).

<?php
function image_colorize(&$img,$rgb) {
 
imageTrueColorToPalette($img,true,256);
 
$numColors = imageColorsTotal($img);

  for (
$x = 0; $x < $numColors; $x++) {
    list(
$r,$g,$b) = array_values(imageColorsForIndex($img,$x));

   
// calculate grayscale in percent
   
$grayscale = ($r + $g + $b) / 3 / 0xff;

   
imageColorSet($img,$x,
     
$grayscale * $rgb[0],
     
$grayscale * $rgb[1],
     
$grayscale * $rgb[2]
    );
  }

  return
true;
}
?>

Example of usage:
<?php
$color
= array(0xff,0xaa,0x2a); // color to convert to
$url = 'http://sundog.net/images/uploads/1_google_logo.jpg';
$img = imageCreateFromJpeg($url);

image_colorize($img,$color);

header('Content-type: image/gif');
imageGif($img);
exit;
?>

Enjoy
up
2
m4551 at abasoft dot it
20 years ago
here's a function to greyscale an image even from a truecolor source (jpeg or png).

slightly poor quality, but very fast...

function imagegreyscale(&$img, $dither=1) {   
    if (!($t = imagecolorstotal($img))) {
        $t = 256;
        imagetruecolortopalette($img, $dither, $t);   
    }
    for ($c = 0; $c < $t; $c++) {   
        $col = imagecolorsforindex($img, $c);
        $min = min($col['red'],$col['green'],$col['blue']);
        $max = max($col['red'],$col['green'],$col['blue']);
        $i = ($max+$min)/2;
        imagecolorset($img, $c, $i, $i, $i);
    }
}
up
1
Thomas Mueller
16 years ago
Here is a function to colorize a picture gradient style.

All you have to do is to pass an img-object and an array of colors.

e.g.

$arr = array('#000000', '#990000', '#00FFFF', '#FFFFDD');
colorize ($img, $arr);

<?php
function colorize($imgdata, $palette)
{
   
imageTrueColorToPalette($imgdata,false,0xFF);
   
$l = count($palette)-1;
   
$i = imagecolorstotal($imgdata);
    while (
$i--)
    {
        list(
$r,$g,$b) = array_values(imageColorsForIndex($imgdata,$i));
       
       
$grayscale = ($r*.3 + $g*.59 +$b*.11) / 0xFF;
       
       
$pos = $l*$grayscale;
       
       
$perc = $pos-floor($pos);
       
       
$tbase = str_replace("#", '', $palette[$pos]);
       
$baseR = hexdec(substr($tbase,0,2));
       
$baseG = hexdec(substr($tbase,2,2));
       
$baseB = hexdec(substr($tbase,4,2));
       
       
$tmix = str_replace("#", '', $palette[$pos+1]);
       
$mixR = hexdec(substr($tmix,0,2));
       
$mixG = hexdec(substr($tmix,2,2));
       
$mixB = hexdec(substr($tmix,4,2));
       
       
$resR = $baseR+($mixR-$baseR)*$perc;
       
$resG = $baseG+($mixG-$baseG)*$perc;
       
$resB = $baseB+($mixB-$baseB)*$perc;
       
       
imagecolorset($imgdata, $i, $resR, $resG, $resB);
    }
}
?>
up
1
dade dot c at email dot it
20 years ago
this is helpful if you would like to implement a color theme system in your website... try it out
Davide Candiloro Italy

function colorize ($pngpath, $r, $g, $b)
/*
REQUIRES: $pngpath to be a valid path of a greyscale PNG-8 image with 64 colors palette
          $r, $g, $b to be integers in the range 0..255
EFFECTS: returns the png image colorized with the color represented by $r, $g, $b.
*/
{
    header("Content-type: image/png");
    $im = imagecreatefrompng("images/table.png");

    imagetruecolortopalette($im, FALSE, 256);
  
      for ($c = 0; $c < 64; $c++){ /*64 is the number of colors in the PNG-8 palette*/
        $col = imagecolorsforindex($im, $c);          
        imagecolorset ( $im, $c, $r*$col['red']/256, $g*$col['green']/256, $b*$col['blue']/256); /*replaces original greyscale palette with a colorized one*/
     }

    imagepng($im);
    imagedestroy($im);
}
up
1
Daniel Klein
9 years ago
If you are creating a palette image from scratch you have to use imagecolorallocate() for each index before you can use imagecolorset() on it.
up
-1
olivier at moostik dot net
23 years ago
This function change colors of an image with ranges 0>100 for each primary color:

int ImageSelectiveColor (int im, int red, int green, int blue)

im is image pointer
red, green and blue are ranges 0->100

function ImageSelectiveColor($im,$red,$green,$blue)
{
  for($i=0;$i<imagecolorstotal($im);$i++)
   {
    $col=ImageColorsForIndex($im,$i);
    $red_set=$red/100*$col['red'];
    $green_set=$green/100*$col['green'];
    $blue_set=$blue/100*$col['blue'];
    if($red_set>255)$red_set=255;
    if($green_set>255)$green_set=255;
    if($blue_set>255)$blue_set=255;
    imagecolorset($im,$i,$red_set,$green_set,$blue_set);
   
   }
  return $im;

}
up
-1
Bartman
15 years ago
I had the same problem as heavyraptor2 so i made this function...
<?php
function imagecolorize($im,$endcolor){
   
//funcion takes image and turns black into $endcolor, white to white and
    //everything in between in corresponding gradient
    //$endcolor should be 6 char html color

    //make sure it has usable palette
   
if (imageistruecolor($im)) {
       
imagetruecolortopalette($im, false, 256);
    }

   
//first make it gray to be sure of even results (thanks moxleystratton.com)
    //comment this loop if you want the output based on, for example,
    //the red channel (for this take a look at the $gray-var in the last loop)
   
for ($c = 0; $c < imagecolorstotal($im); $c++) {
       
$col = imagecolorsforindex($im, $c);
       
$gray = round(0.299 * $col['red'] + 0.587 * $col['green'] + 0.114 * $col['blue']);
       
imagecolorset($im, $c, $gray, $gray, $gray);
    }

   
//determine end-colors in hexdec
   
$EndcolorRGB['r'] = hexdec( substr($endcolor, 0, 2));
   
$EndcolorRGB['g'] = hexdec( substr($endcolor, 2, 2));
   
$EndcolorRGB['b'] = hexdec( substr($endcolor, 4, 2));

   
//determine gradient-delta's
   
$stepR = (255-$EndcolorRGB['r'])/255.0;
   
$stepG = (255-$EndcolorRGB['g'])/255.0;
   
$stepB = (255-$EndcolorRGB['b'])/255.0;

   
//aColor contains the 256 gradations between endcolor(i=0) and white(i=255)
   
$aColor = array();
    for (
$i = 0; $i<=255; $i++){
       
$aColor[$i]['r'] = $EndcolorRGB['r'] + ($i*$stepR);
       
$aColor[$i]['g'] = $EndcolorRGB['g'] + ($i*$stepG);
       
$aColor[$i]['b'] = $EndcolorRGB['b'] + ($i*$stepB);
    }

   
//for every color-index we now replace $gray-values for $aColor
   
for ($c = 0; $c < imagecolorstotal($im); $c++){
       
$currentColorRGB = imagecolorsforindex($im, $c);
       
$gray = $currentColorRGB['red'];//image is grayscale, so red,green and blue
        // should be equal. We use this number as key of aColor
       
imagecolorset($im,$c,(int)$aColor[$gray]['r'], (int)$aColor[$gray]['g'], (int)$aColor[$gray]['b']);
    }
}
?>
up
-1
admin at phpgfx dot com
17 years ago
Here is a function to turn an image into pure black and white

<?php

function imagepurebw( $img, $amount = 383 ) {
   
$total = imagecolorstotal( $img );
    for (
$i = 0; $i < $total; $i++ ) {
       
$index = imagecolorsforindex( $img, $i );
       
array_pop( $index );
       
$color = ( array_sum( $index ) > $amount ) ? 255 : 0;
       
imagecolorset( $img, $i, $color, $color, $color );
    }
}

?>
up
-2
info at devking dot com
22 years ago
here's a simple function to greyscale an image...

function imagecolorgrey( &$img ) {
for( $i=0; $i<imagecolorstotal( $img ); $i++ ) {
  $c = ImageColorsForIndex( $img, $i );
  $t = ($c["red"]+$c["green"]+$c["blue"])/3;
  imagecolorset( $img, $i, $t, $t, $t );   
}
}
To Top