imagetruecolortopalette

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

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

描述

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

imagetruecolortopalette() 将真彩色图像转换为调色板图像。此函数的代码最初来自独立 JPEG 组库代码,该代码非常出色。该代码已修改以在生成的调色板中尽可能多地保留 alpha 通道信息,以及尽可能多地保留颜色。这可能无法达到预期效果。通常最好简单地生成一个真彩色输出图像,这可以保证最高的输出质量。

参数

image

一个 GdImage 对象,由图像创建函数(如 imagecreatetruecolor())返回。

dither

指示是否应该对图像进行抖动 - 如果它是 true 则将使用抖动,这将导致图像更加斑点,但具有更好的颜色近似值。

num_colors

设置应在调色板中保留的最大颜色数。

返回值

成功时返回 true,失败时返回 false

变更日志

版本 描述
8.0.0 image 现在期望一个 GdImage 实例;以前,期望一个有效的 gd resource

示例

示例 #1 将真彩色图像转换为基于调色板的图像

<?php
// 创建一个新的真彩色图像
$im = imagecreatetruecolor(100, 100);

// 转换为基于调色板的,无抖动,255 种颜色
imagetruecolortopalette($im, false, 255);

// 保存图像
imagepng($im, './paletteimage.png');
imagedestroy($im);
?>

添加注释

用户贡献的注释 6 notes

7
zmorris at zsculpt dot com
19 年前
有时此函数会产生难看/暗淡的颜色(尤其是在 ncolors < 256 时)。这里有一个替代方法,它使用临时图像和 ImageColorMatch() 来更准确地匹配颜色。它可能稍微慢一点,但文件大小最终相同

<?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 );
}
?>
2
djcassis(a)gmail.com
15 年前
>> zmorris at zsculpt dot com

我的服务器上没有 imageColorMatch() 函数,但我可以通过先将 GIF/PNG 图像转换为 256 色,然后转换为真彩色,最后转换为所需的颜色数量来稍微提高图像质量。

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

?>

最终的 $image 仍然会有少于 64 种颜色,但比直接转换为 64 种颜色要多,而且它们更匹配 JPEG 图像。

不知道为什么真彩色到调色板的转换如此成问题......
1
php at roelvanmastbergen dot nl
20 年前
此函数创建的调色板通常看起来很糟糕(至少在我的所有测试图像上都是这样)。转换真彩色图像的更好方法是首先使用 imagecopyresampled() 将它们缩放到 16x16 像素的目的地。然后,缩小的图像仅包含 256 个像素,这正是您需要的颜色数量。这些颜色通常比 imagetruecolortopalette() 生成的颜色看起来好得多。

我发现此方法唯一的缺点是原始图像中不同颜色的细节在转换过程中丢失了。
0
jemore at nospaM dot m6net dot fr
20 年前
如果您打开一个真彩色图像(例如,使用 imageCreateFromPng),并将其直接保存为 GIF 格式(使用 imagegif),则可能会出现 500 内部服务器错误。在以 GIF 格式保存图像之前,您必须使用 imageTrueColorToPalette 将其缩减到 256 色。
0
darkelder at php dot net
21 年前
使用此函数应将 TrueColor 图像转换为调色板图像。因此,如果要使用 imagecolorstotal() 函数 [ https://php.net/manual/en/function.imagecolorstotal.php ] ,则应首先使用 imagetruecolortopalette(); 将图像转换为调色板图像。
-5
will at fnatic dot com
18 年前
一个基本的调色板到真彩色函数
<?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