當前位置: 首頁> 最新文章列表> 配合imagecolorset() 與imagecolorresolve() 動態修改顏色映射

配合imagecolorset() 與imagecolorresolve() 動態修改顏色映射

M66 2025-05-30

在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()修改對應顏色值,可以非常方便地實現圖像顏色動態替換。這種技術特別適合在需要對固定顏色區域快速變更時使用,比如游戲貼圖、動態圖標定制等場景。

如果你的項目中需要處理大量動態圖像,建議配合更高級的圖像處理庫如GDImagick使用,以獲取更強大的功能。