文字

imagecolorset

(PHP 4, PHP 5, PHP 7)

imagecolorset给指定调色板索引设定颜色

说明

void imagecolorset ( resource $image , int $index , int $red , int $green , int $blue )

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

参见 imagecolorat()

用户评论:

[#1] Daniel Klein [2015-07-01 13:25:43]

If you are creating a palette image from scratch you have to use imagecolorallocate() for each index before you can use imagecolorset() on it.

[#2] Bartman [2009-08-25 02:12:07]

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($imfalse256);
    }

    
//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'] = hexdecsubstr($endcolor02));
    
$EndcolorRGB['g'] = hexdecsubstr($endcolor22));
    
$EndcolorRGB['b'] = hexdecsubstr($endcolor42));

    
//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']);
    }
}
?>

[#3] Thomas Mueller [2008-04-23 10:42:34]

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

[#4] heavyraptor2 at hotmail dot com [2008-02-20 01:08:33]

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

[#5] admin at phpgfx dot com [2007-08-25 11:37:47]

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

?>

[#6] moxleystratton.com [2006-10-04 15:59:21]

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($imfalse256);
    }

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

[#7] dade dot c at email dot it [2004-10-02 13:47:29]

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) 

{
header("Content-type: image/png");
$im = imagecreatefrompng("images/table.png");

imagetruecolortopalette($im, FALSE, 256); 
   
   for ($c = 0; $c < 64; $c++){ 
     $col = imagecolorsforindex($im, $c);   
imagecolorset ( $im, $c, $r*$col['red']/256, $g*$col['green']/256, $b*$col['blue']/256); 
  }

imagepng($im);
imagedestroy($im);
}

[#8] m4551 at abasoft dot it [2004-04-23 09:19:41]

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

[#9] info at devking dot com [2002-08-08 14:20:29]

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

[#10] olivier at moostik dot net [2001-07-11 17:49:55]

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;
 
 }

上一篇: 下一篇: