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;
}
?>
imagetruecolortopalette
(PHP 4 >= 4.0.6, PHP 5)
imagetruecolortopalette — Convertit une image en couleurs vraies en image à palette
Description
imagetruecolortopalette() convertit l'image en vraies couleurs image en image à palette. Le code de cette fonction est directement tiré de la bibliothèque du Independent JPEG Group, qui est tout simplement génial. Le code a été modifié pour préserver l'essentiel du canal alpha dans la nouvelle palette, en plus de conserver les couleurs du mieux possible. Mais cela ne fonctionne pas toujours comme voulu. Il est alors préférable de générer un résultat en vraies couleurs, ce qui donne toujours le meilleur rendu.
Liste de paramètres
- image
-
Une ressource d'image, retourné par une des fonctions de création d'images, comme imagecreatetruecolor().
- dither
-
Indique si l'image doit être granuleuse - si défini à TRUE, alors l'image sera un peu plus granuleuse mais l'approximation des couleurs sera meilleure.
- ncolors
-
Le nombre maximal de couleurs dans la palette finale.
Valeurs de retour
Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.
Notes
Note: Cette fonction requiert la bibliothèque GD 2.0.1 ou supérieure (2.0.28 ou supérieure est recommandée).
imagetruecolortopalette
28-May-2006 06:51
24-Feb-2006 09: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;
}
}
?>
17-Aug-2004 07: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 );
}
?>
06-Jun-2004 06: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.
22-Nov-2003 07: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.
17-Jul-2003 10: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();
