在PHP 中處理圖像時,動態地修改顏色映射是一項非常實用的技能。特別是當我們想快速改變一張索引圖(palette-based image)中的某些顏色,而不需要重新繪製整張圖像時, imagecolorset()和imagecolorresolve()就變得尤為重要了。
本文將教你如何配合使用這兩個函數,來實現動態修改圖片顏色映射的效果。
imagecolorset(resource $image, int $index, int $red, int $green, int $blue, int $alpha = 0): bool
這個函數可以直接修改圖像調色板中某個顏色索引的顏色值。也就是說,如果圖中某個像素使用了這個顏色索引,那麼它的顏色也會立刻改變。
imagecolorresolve(resource $image, int $red, int $green, int $blue): int
這個函數查找圖像調色板中最接近指定RGB 顏色的索引。如果找不到完全匹配的顏色,它會嘗試分配一個新的索引。
這兩個函數搭配使用,可以讓我們先定位想要修改的顏色,然後動態設置新的顏色。
假設我們有一張簡單的調色板圖像,我們希望把圖像中原本的藍色改成紅色。
<?php
// 創建一個簡單的調色板圖像
$image = imagecreate(100, 100);
// 定義初始顏色
$white = imagecolorallocate($image, 255, 255, 255); // 背景色:白色
$blue = imagecolorallocate($image, 0, 0, 255); // 畫筆色:藍色
// 用藍色画一个矩形
imagefilledrectangle($image, 10, 10, 90, 90, $blue);
// 动态找到藍色的顏色索引
$targetIndex = imagecolorresolve($image, 0, 0, 255);
// 使用 imagecolorset 修改藍色为紅色
// 參數分別是:圖像資源、顏色索引、紅、綠、藍、透明度
imagecolorset($image, $targetIndex, 255, 0, 0);
// 輸出圖像到瀏覽器
header('Content-Type: image/png');
imagepng($image);
// 釋放內存
imagedestroy($image);
?>
這段代碼執行後,你會看到原本藍色的矩形變成了紅色,非常絲滑。
這套方法只適用於調色板圖(即palette-based image,如GIF 或用imagecreate()創建的小圖)。
對於真彩色圖(由imagecreatetruecolor()創建的), imagecolorset()是無效的。
如果圖片中存在多個相似但不完全相同的顏色,使用imagecolorresolve()找到的顏色可能不是你預期的,所以有時需要提前規範圖像的調色板。
比如,你想開發一個網頁功能,用戶可以點擊按鈕動態改變圖片配色,可以用上面這套方案,結合簡單的表單提交。例如:
<form method="post" action="https://m66.net/change_color.php">
<input type="submit" name="change" value="換色!">
</form>
然後在change_color.php中用剛才的腳本處理圖像,達到動態換色的效果。
通過組合使用imagecolorresolve()查找目標顏色索引,再用imagecolorset()修改對應顏色值,可以非常方便地實現圖像顏色動態替換。這種技術特別適合在需要對固定顏色區域快速變更時使用,比如游戲貼圖、動態圖標定制等場景。
如果你的項目中需要處理大量動態圖像,建議配合更高級的圖像處理庫如GD或Imagick使用,以獲取更強大的功能。