International PHP Conference Berlin 2025

imagetruecolortopalette

(PHP 4 >= 4.0.6, PHP 5, PHP 7, PHP 8)

imagetruecolortopaletteConverte uma imagem em cores verdadeiras em uma imagem de paleta

Descrição

imagetruecolortopalette(GdImage $image, bool $dither, int $num_colors): bool

imagetruecolortopalette() converte uma imagem em cores verdadeiras em uma imagem de paleta. O código para esta função foi originalmente escrito a partir do código da biblioteca do Independent JPEG Group, que é excelente. O código foi modificado para presevar o máximo possível de informação do canal alfa na paleta resultante, além de preservar as cores da melhor maneira possível. Isto não funciona tão bem quanto esperado. Normalmente é melhor simplesmente produzir uma imagem em cores verdadeiras, o que garante a qualidade de saída mais alta possível.

Parâmetros

image

Um objeto GdImage, retornado por uma das funções de criação de imagem, como imagecreatetruecolor().

dither

Indica se a imagem deve ser pontilhada - se for true o pontilhamento será usado, o que resultará em uma imagem mais salpicada mas com uma melhor aproximação de cores.

num_colors

Define o número máximo de cores que deve sem mantido na paleta.

Valor Retornado

Retorna true em caso de sucesso ou false em caso de falha.

Registro de Alterações

Versão Descrição
8.0.0 O parâmetro image agora espera uma instância de GdImage; anteriormente, um resource gd válido era esperado.

Exemplos

Exemplo #1 Convertendo uma imagem em cores verdadeiras em uma imagem de paleta

<?php
// Cria uma nova imagem em cores verdadeiras
$im = imagecreatetruecolor(100, 100);

// Converte para paleta sem pontilhamento e com 255 cores
imagetruecolortopalette($im, false, 255);

// Grava a imagem
imagepng($im, './paletteimage.png');
imagedestroy($im);
?>

adicione uma nota

Notas Enviadas por Usuários (em inglês) 6 notes

up
7
zmorris at zsculpt dot com
20 years ago
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 );
}
?>
up
2
djcassis(a)gmail.com
16 years ago
>> zmorris at zsculpt dot com

I don't have the imageColorMatch() function on my server, but I could slighty improve the quality of the GIF/PNG image by converting it first to 256 colors, then to true colors and finally to the desired number of colors.

<?php

$dither
= true;
$colors = 64;

$tmp = imageCreateFromJpeg('example.jpg');
$width = imagesX($tmp);
$height = imagesY($tmp);
imageTrueColorToPalette($tmp, $dither, 256);
$image = imageCreateTrueColor($width, $height);
imageCopy($image, $tmp, 0, 0, 0, 0, $width, $height);
imageDestroy($tmp);
imageTrueColorToPalette($image, $dither, $colors);

?>

Final $image will still have less than 64 colors, but more than if it was directly converted to 64 colors, and they match the JPEG image more.

Dunno why true colors to palette conversions are such a problem...
up
1
php at roelvanmastbergen dot nl
20 years ago
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.
up
0
jemore at nospaM dot m6net dot fr
21 years ago
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.
up
0
darkelder at php dot net
21 years ago
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();
up
-5
will at fnatic dot com
18 years ago
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;
}
}
?>
To Top