本篇內容主要講解“php怎么合并圖片并變動部分顏色”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“php怎么合并圖片并變動部分顏色”吧!
php的GD庫提供了很多基礎圖片操作功能,可以分為兩大類:
真彩圖操作:支持直接透明圖片處理,但不支持顏色變換,允許畫入新內容。
調色板圖操作:支持指定顏色為透明,并且支持顏色變換,允許畫入新內容。
兩種類型的圖片可以相互轉換,如果原圖片有透明塊盡可能避免直接轉為調色板圖(透明塊容易出現未知異常)但可以合并到調色板圖中從而保留了原圖的透明,如果在調色板圖中指定了某個色值為透明則在生成圖片后這個色值為透明的。
如果只使用GD庫在不需要變換圖片顏色的時候基本上不需要使用調色板,相反需要有變換圖片顏色時則只能使用調色板。
這里以生成小怪物為目標來操作變換小怪物的顏色:
首先需要準備5個基本圖片元素:

圖片要求:
所有圖片最好全新畫的(最好使用矢量圖生成的),所有需要變色的原顏色與其它顏色連接處不能有過渡,否則替換顏色后原連接過渡顏色將被保留,影響美觀。
eyes.png 除了眼睛體外全部透明化處理。
fleck.png 除了斑紋休外全部透明化處理。
mouth.png 除了嘴巴體外全部透明化處理。
shadow.png 體型內無顏色透明化處理,體型外全部使用白色。
shape.png 不要有透明內容。
所有需要替換顏色的色值在其它所所部位最好都不要出現。
下面給一個生成不同顏色寵物的示例代碼:
$image = imagecreatefrompng('shape.png'); //取體型圖片
list($src_w, $src_h) = getimagesize('shape.png'); //獲取寬高度
imagetruecolortopalette($image, false, 256); //轉換為調色板圖像,只有調色板才能換顏色
$color_index = imagecolorat($image, 276, 621); //獲取顏色索引值(體型顏色)
imagecolorset($image, $color_index, mt_rand(0, 255), mt_rand(0, 255), mt_rand(0, 255)); //修改顏色
$color_index = imagecolorat($image, 450, 780); //獲取顏色索引值(肚皮顏色)
imagecolorset($image, $color_index, mt_rand(0, 255), mt_rand(0, 255), mt_rand(0, 255)); //修改顏色
// 這段處理非常重要,如果直接轉換為真彩圖會造成后續有透明圖片合并異常
// 如果直接使用 **imagepalettetotruecolor** 函數也會有異常,可能是調色板數據未清除造成的
// 如同把圖片寫到文件再讀取一樣,得到真彩圖
$_image = imagecreatetruecolor($src_w, $src_h); //創建真彩圖
$color = imagecolorallocate($_image, 255, 255, 255); //分配顏色
imagefill($_image, 0, 0, $color); //填充
imagecopyresampled($_image, $image, 0, 0, 0, 0, $src_w, $src_h, $src_w, $src_h); //合并修改后的圖片
$image = $_image;
/* 斑紋處理 */
$image_fleck = imagecreatefrompng('fleck.png'); //取斑紋圖片
imagecopyresampled($image, $image_fleck, 0, 0, 0, 0, $src_w, $src_h, $src_w, $src_h); //合并
imagetruecolortopalette($image, false, 256); //轉換為調色板圖像,只有調色板才能換顏色
$color_index = imagecolorat($image, 385, 925); //獲取顏色索引值(斑紋顏色)
imagecolorset($image, $color_index, mt_rand(0, 255), mt_rand(0, 255), mt_rand(0, 255)); //修改顏色
// 如同把圖片寫到文件再讀取一樣,得到真彩圖,與上面一樣,如果不這樣處理后續的透明圖合并將會有異常
$_image = imagecreatetruecolor($src_w, $src_h); //創建真彩圖
$color = imagecolorallocate($_image, 255, 255, 255); //分配顏色
imagefill($_image, 0, 0, $color); //填充
imagecopyresampled($_image, $image, 0, 0, 0, 0, $src_w, $src_h, $src_w, $src_h); //合并修改后的圖片
$image = $_image;
/* 體型陰影處理 */
imagecopyresampled($image, imagecreatefrompng('test1/shadow.png'), 0, 0, 0, 0, $src_w, $src_h, $src_w, $src_h);
/* 嘴巴處理 */
imagecopyresampled($image, imagecreatefrompng('test1/mouth.png'), 0, 0, 0, 0, $src_w, $src_h, $src_w, $src_h);
/* 眼睛處理 */
$image_eyes = imagecreatefrompng('eyes.png'); //取斑紋圖片
imagetruecolortopalette($image, false, 256); //轉換為調色板圖像,只有調色板才能換顏色
imagecopyresampled($image, $image_eyes, 0, 0, 0, 0, $src_w, $src_h, $src_w, $src_h); //合并
$color_index = imagecolorat($image_eyes, 285, 335); //獲取顏色索引值(眼睛顏色)
imagecolorset($image, $color_index, mt_rand(0, 255), mt_rand(0, 255), mt_rand(0, 255)); //修改顏色
// 如同把圖片寫到文件再讀取一樣,得到真彩圖,與上面一樣,如果不這樣處理后續的透明圖合并將會有異常
$_image = imagecreatetruecolor($src_w, $src_h); //創建真彩圖
$color = imagecolorallocate($_image, 255, 255, 255); //分配顏色
imagefill($_image, 0, 0, $color); //填充
imagecopyresampled($_image, $image, 0, 0, 0, 0, $src_w, $src_h, $src_w, $src_h); //合并修改后的圖片
$image = $_image;
//添加背景
$color_index = imagecolorat($image, 435, 300); //獲取顏色索引值(背景顏色)
imagefilltoborder($image, 0, 0, $color_index, imagecolorallocate($image, mt_rand(0, 255), mt_rand(0, 255), mt_rand(0, 255)));
imagesavealpha($image, true); //保存 alpha 通道信息,如果圖片中有透明內容則需要
header('Content-type:image/png');
imagepng($image, null, 9);
imagedestroy($image);注意: 替換圖片顏色時需要取出調色板顏色的索引值函數 imagecolorat 就是取顏色的索引值(想獲取哪個顏色給出顏色的任意坐標值即可),由于我測試時圖片1304 X 1412 所以代碼中坐標值都比較大,還有顏色替換會有鋸齒這是因為像素點為矩形造成的當圖片有一定大小時不會影響太多美觀。
執行結果如下:

到此,相信大家對“php怎么合并圖片并變動部分顏色”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。