PHP Conference Japan 2024

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 条注释

7
zmorris at zsculpt dot com
20 年前
有时此函数会产生难看/暗淡的颜色(尤其是在 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
16 年前
>> zmorris at zsculpt dot com

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

<?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
21 年前
如果您打开一个真彩色图像(例如使用 imageCreateFromPng),并将其直接保存为 GIF 格式(使用 imagegif),则可能会出现 500 内部服务器错误。在以 GIF 格式保存图像之前,必须使用 imageTrueColorToPalette 将其减少到 256 色。
0
darkelder at php dot net
21 年前
真彩色图像应使用此函数转换为调色板图像。因此,如果您想使用 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