• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • imagecolorset()

    (PHP 4, PHP 5, PHP 7)

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

    说明

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

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

    参见imagecolorat()。

    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);
      }
    }
    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);
      }
    }
    ?>
    
    If you are creating a palette image from scratch you have to use imagecolorallocate() for each index before you can use imagecolorset() on it.
    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);
      }
    }
    ?>
    
    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
    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);
    }
    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;
     
     }
    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']);
      }
    }?>
    
    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 );
      }
    }
    ?>
    
    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 );  
     }
    }