2024 年 PHP 日本會議

imagetruecolortopalette

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

imagetruecolortopalette將真彩色影像轉換為調色盤影像

描述

imagetruecolortopalette(GdImage $image, 布林值 $dither, 整數 $num_colors): 布林值

imagetruecolortopalette() 會將真彩色影像轉換為調色盤影像。此函式的程式碼最初來自 Independent JPEG Group 函式庫程式碼,該程式碼非常出色。除了盡可能保留顏色之外,程式碼也經過修改,以在產生的調色盤中盡可能保留 Alpha 色板資訊。這並不一定能達到預期的效果。通常最好直接產生真彩色輸出影像,以確保最高的輸出品質。

參數

image

一個 GdImage 物件,由影像建立函式之一返回,例如 imagecreatetruecolor()

dither

指示影像是否應該抖動 - 如果是 true,則會使用抖動,這將產生更斑點的影像,但具有更好的顏色近似值。

num_colors

設定應保留在調色盤中的最大顏色數。

傳回值

成功時傳回 true,失敗時傳回 false

更新日誌

版本 描述
8.0.0 image 現在需要一個 GdImage 實例;以前需要一個有效的 gd 資源

範例

範例 #1 將真彩色影像轉換為基於調色盤的影像

<?php
// 建立一個新的真彩色影像
$im = imagecreatetruecolor(100, 100);

// 轉換為基於調色盤的影像,不使用抖動,並使用 255 種顏色
imagetruecolortopalette($im, false, 255);

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

新增註解

使用者貢獻的註解 6 則註解

zmorris at zsculpt dot com
20 年前
有時此函式會產生難看/暗淡的顏色(尤其是在 ncolors < 256 時)。以下是一個替代方案,它使用暫存影像和 ImageColorMatch() 來更準確地匹配顏色。它可能會稍微慢一些,但檔案大小最終會相同

<?php
函數 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 );
}
?>
djcassis(a)gmail.com
16 年前
>> 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 影像更相符。

不知道為什麼真彩色轉換成色盤會是個問題…
php at roelvanmastbergen dot nl
20 年前
這個函數建立的調色盤通常看起來很糟糕(至少在我的所有測試圖片上都是如此)。一個更好的轉換真彩色圖像的方法是,先使用 imagecopyresampled() 將它們縮小到 16x16 像素的目標大小,建立一個調整大小的副本。調整大小後的圖像只包含 256 個像素,這正是您需要的顏色數量。這些顏色通常看起來比 imagetruecolortopalette() 生成的顏色好得多。

我發現這個方法唯一的缺點是原始圖像中不同顏色的細節在轉換過程中會丟失。
jemore at nospaM dot m6net dot fr
21 年前
如果您打開一個真彩色圖像(例如使用 imageCreateFromPng),並且直接使用 imagegif 將其保存為 GIF 格式,則可能會出現 500 內部伺服器錯誤。您必須先使用 imageTrueColorToPalette 將顏色減少到 256 色,才能將圖像保存為 GIF 格式。
darkelder at php dot net
21 年前
應該使用此函數將真彩色圖像轉換為調色盤圖像。因此,如果您想使用 imagecolorstotal() 函數 [ https://php.dev.org.tw/manual/en/function.imagecolorstotal.php ],您應該先使用 imagetruecolortopalette() 將圖像轉換為調色盤圖像。
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