本篇內(nèi)容主要講解“php怎么合并圖片并變動部分顏色”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“php怎么合并圖片并變動部分顏色”吧!
創(chuàng)新互聯(lián)公司是一家專業(yè)從事網(wǎng)站設(shè)計(jì)制作、成都做網(wǎng)站的網(wǎng)絡(luò)公司。作為專業(yè)的建站公司,創(chuàng)新互聯(lián)公司依托的技術(shù)實(shí)力、以及多年的網(wǎng)站運(yùn)營經(jīng)驗(yàn),為您提供專業(yè)的成都網(wǎng)站建設(shè)、成都全網(wǎng)營銷推廣及網(wǎng)站設(shè)計(jì)開發(fā)服務(wù)!
php的GD庫提供了很多基礎(chǔ)圖片操作功能,可以分為兩大類:
真彩圖操作:支持直接透明圖片處理,但不支持顏色變換,允許畫入新內(nèi)容。
調(diào)色板圖操作:支持指定顏色為透明,并且支持顏色變換,允許畫入新內(nèi)容。
兩種類型的圖片可以相互轉(zhuǎn)換,如果原圖片有透明塊盡可能避免直接轉(zhuǎn)為調(diào)色板圖(透明塊容易出現(xiàn)未知異常)但可以合并到調(diào)色板圖中從而保留了原圖的透明,如果在調(diào)色板圖中指定了某個(gè)色值為透明則在生成圖片后這個(gè)色值為透明的。
如果只使用GD庫在不需要變換圖片顏色的時(shí)候基本上不需要使用調(diào)色板,相反需要有變換圖片顏色時(shí)則只能使用調(diào)色板。
這里以生成小怪物為目標(biāo)來操作變換小怪物的顏色:
首先需要準(zhǔn)備5個(gè)基本圖片元素:

圖片要求:
所有圖片最好全新畫的(最好使用矢量圖生成的),所有需要變色的原顏色與其它顏色連接處不能有過渡,否則替換顏色后原連接過渡顏色將被保留,影響美觀。
eyes.png 除了眼睛體外全部透明化處理。
fleck.png 除了斑紋休外全部透明化處理。
mouth.png 除了嘴巴體外全部透明化處理。
shadow.png 體型內(nèi)無顏色透明化處理,體型外全部使用白色。
shape.png 不要有透明內(nèi)容。
所有需要替換顏色的色值在其它所所部位最好都不要出現(xiàn)。
下面給一個(gè)生成不同顏色寵物的示例代碼:
$image = imagecreatefrompng('shape.png'); //取體型圖片
list($src_w, $src_h) = getimagesize('shape.png'); //獲取寬高度
imagetruecolortopalette($image, false, 256); //轉(zhuǎn)換為調(diào)色板圖像,只有調(diào)色板才能換顏色
$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)); //修改顏色
// 這段處理非常重要,如果直接轉(zhuǎn)換為真彩圖會造成后續(xù)有透明圖片合并異常
// 如果直接使用 **imagepalettetotruecolor** 函數(shù)也會有異常,可能是調(diào)色板數(shù)據(jù)未清除造成的
// 如同把圖片寫到文件再讀取一樣,得到真彩圖
$_image = imagecreatetruecolor($src_w, $src_h); //創(chuàng)建真彩圖
$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); //轉(zhuǎn)換為調(diào)色板圖像,只有調(diào)色板才能換顏色
$color_index = imagecolorat($image, 385, 925); //獲取顏色索引值(斑紋顏色)
imagecolorset($image, $color_index, mt_rand(0, 255), mt_rand(0, 255), mt_rand(0, 255)); //修改顏色
// 如同把圖片寫到文件再讀取一樣,得到真彩圖,與上面一樣,如果不這樣處理后續(xù)的透明圖合并將會有異常
$_image = imagecreatetruecolor($src_w, $src_h); //創(chuàng)建真彩圖
$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); //轉(zhuǎn)換為調(diào)色板圖像,只有調(diào)色板才能換顏色
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)); //修改顏色
// 如同把圖片寫到文件再讀取一樣,得到真彩圖,與上面一樣,如果不這樣處理后續(xù)的透明圖合并將會有異常
$_image = imagecreatetruecolor($src_w, $src_h); //創(chuàng)建真彩圖
$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 通道信息,如果圖片中有透明內(nèi)容則需要
header('Content-type:image/png');
imagepng($image, null, 9);
imagedestroy($image);注意:替換圖片顏色時(shí)需要取出調(diào)色板顏色的索引值函數(shù) imagecolorat就是取顏色的索引值(想獲取哪個(gè)顏色給出顏色的任意坐標(biāo)值即可),由于我測試時(shí)圖片1304 X 1412 所以代碼中坐標(biāo)值都比較大,還有顏色替換會有鋸齒這是因?yàn)橄袼攸c(diǎn)為矩形造成的當(dāng)圖片有一定大小時(shí)不會影響太多美觀。
執(zhí)行結(jié)果如下:

到此,相信大家對“php怎么合并圖片并變動部分顏色”有了更深的了解,不妨來實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!
網(wǎng)站題目:php怎么合并圖片并變動部分顏色
網(wǎng)址分享:http://chinadenli.net/article12/ggjjgc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供面包屑導(dǎo)航、網(wǎng)站設(shè)計(jì)公司、網(wǎng)站排名、App開發(fā)、網(wǎng)站設(shè)計(jì)、網(wǎng)站收錄
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)