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

本函数将调色板中指定的索引设定为指定的颜色。对于在调色板图像中创建类似区域填充(flood-fill)的效果很有用,免去了真的去填充的开销。

参数

image

由图象创建函数(例如imagecreatetruecolor())返回的 GdImage 对象。

color

调色板中的索引值。

red

红色成分的值。

green

绿色成分的值。

blue

蓝色成分的值。

alpha

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

参见

添加备注

用户贡献的备注 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:<?phpfunction 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
17 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).<?phpfunction 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
21 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
17 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);<?phpfunction 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 outDavide Candiloro Italyfunction 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..255EFFECTS: 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
10 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
24 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...<?phpfunction 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<?phpfunction 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
23 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