imagetruecolortopalette

(PHP 4 >= 4.0.6, PHP 5)

imagetruecolortopalette -- 将真彩色图像转换为调色板图像

说明

bool imagetruecolortopalette ( resource image, bool dither, int ncolors )

imagetruecolortopalette() 将一幅真彩色图像转换为调色板图像。本函数的代码原本是从独立的 JPEG 小组库代码中提取出来的,非常出色。此代码被修改以在结果调色板中保留尽可能多的 alpha 通道信息以及尽可能多的颜色。但并没有达到期望的效果。通常最好生成真彩色图像输出,这样可以保证得到最高的输出质量。

dither 指明图像是否被抖动(dithered),如果为 TRUE 则图像将被抖动使图像中的斑点更多但是颜色更接近。

ncolors 设定调色板中被保留的颜色的最大数目。

注: 本函数需要 GD 2.0.1 或更高版本。


add a note add a note User Contributed Notes
burninleo at gmx dot net
29-May-2006 12:51
If You know which palette to use (e.g. 255 colors greyscale) You may achieve better results using the following way:

1. Create new image
2. Apply palette
3. imagecopy() the content

This is especially helpful if you created a greyscale picture in trucolor-mode (to use antialiasing for example) but need to send it as palette (to use transparency in Internet Explorer).

The following example will *not* create great results from "real" truecolor images but works well on grey truecolor images:

<?PHP
function imageTruecolorToGrayscale(&$image) {
  
$copy = $image;
  
$dx = imagesx($image);
  
$dy = imagesy($image);
  
$image = imagecreate($dx, $dy);
  
  
// 254 Colors + 1 reserved for transparency
  
$transparency = imagecolorallocate($image, 0, 255, 0);
  
$max = 255; $dd = 254;
   for (
$i=0; $i<$dd; $i++) {
      
$val = round($max * $i / ($dd-1));
      
imagecolorallocate($image, $val, $val, $val);
   }
  
  
imagecopy($image, $copy, 0, 0, 0, 0, $dx, $dy);
  
imagedestroy($copy);
   return
$transparency;
}
?>
will at fnatic dot com
25-Feb-2006 04:49
a basic palette to true color function
<?php
  
function imagepalettetotruecolor(&$img)
   {
       if (!
imageistruecolor($img))
       {
          
$w = imagesx($img);
          
$h = imagesy($img);
          
$img1 = imagecreatetruecolor($w,$h);
          
imagecopy($img1,$img,0,0,0,0,$w,$h);
          
$img = $img1;
       }
   }
?>
zmorris at zsculpt dot com
17-Aug-2004 01:58
Sometimes this function gives ugly/dull colors (especially when ncolors < 256).  Here is a replacement that uses a temporary image and ImageColorMatch() to match the colors more accurately.  It might be a hair slower, but the file size ends up the same:

<?php
function    ImageTrueColorToPalette2( $image, $dither, $ncolors )
{
  
$width = imagesx( $image );
  
$height = imagesy( $image );
  
$colors_handle = ImageCreateTrueColor( $width, $height );
  
ImageCopyMerge( $colors_handle, $image, 0, 0, 0, 0, $width, $height, 100 );
  
ImageTrueColorToPalette( $image, $dither, $ncolors );
  
ImageColorMatch( $colors_handle, $image );
  
ImageDestroy( $colors_handle );
}
?>
php at roelvanmastbergen dot nl
07-Jun-2004 12:34
The palette created by this function often looks quite awful (at least it did on all of my test images). A better way to convert your true-colour images is by first making a resized copy of them with imagecopyresampled() to a 16x16 pixel destination. The resized image then contains only 256 pixels, which is exactly the number of colours you need. These colours usually look a lot better than the ones generated by imagetruecolortopalette().

The only disadvantage to this method I have found is that different-coloured details in the original image are lost in the conversion.
jemore at nospaM dot m6net dot fr
23-Nov-2003 02:25
If you open a truecolor image (with imageCreateFromPng for example), and you save it directly to GIF format with imagegif, you can have a 500 internal server error. You must use imageTrueColorToPalette to reduce to 256 colors before saving the image in GIF format.
darkelder at php dot net
18-Jul-2003 04:34
TrueColor images should be converted to Palette images with this function. So, if you want to use imagecolorstotal() function [ http://php.net/manual/en/function.imagecolorstotal.php ] , you should first convert the image to a palette image with imagetruecolortopalette();