php 网页 透明背景图片,php 处理透明背景的图片时的问题
PHP圖象處理之透明背景的gif和png圖片的一些問(wèn)題
1,直接讀取有透明背景的PNG格式文件,然后直接輸出,背景變成了黑色,gif則沒(méi)有這種情況。
解決方法:使用 imagesavealpha ($image, true),此函數(shù)是針對(duì)png格式的.
PHP
$im=imagecreatefrompng("demo_1.png");
imagesavealpha($im, true);//設(shè)置標(biāo)記以在保存 PNG 圖像時(shí)保存完整的 alpha 通道信息。
header('Content-type: image/png');
imagepng($im);
imagedestroy($im);
?>
1
2
3
4
5
6
7
$im=imagecreatefrompng("demo_1.png");
imagesavealpha($im,true);//設(shè)置標(biāo)記以在保存 PNG 圖像時(shí)保存完整的 alpha 通道信息。
header('Content-type: image/png');
imagepng($im);
imagedestroy($im);
?>
注意一點(diǎn):不是所有的瀏覽器都支持 alpha 通道,如果在你的瀏覽器上碰到問(wèn)題,試著用兼容 alpha 通道的瀏覽器(例如最新版的 Mozilla)重新加載腳本。
經(jīng)測(cè)試,在IE中顯示效果不理想(但圖片仍然是透明的,保存下來(lái)看下就知道),背景變成了灰色.
2,在處理(比如縮小,剪切)有透明背景的gif和png圖片然后輸出時(shí),圖片透明部分變成了黑色。
示例代碼如下:
PHP
$size = 300;
$image=imagecreatetruecolor($size, $size);//創(chuàng)建圖片
$back =imagecolorallocatealpha($image, 255, 255, 255,127);//加透明顏色,其實(shí)好象沒(méi)什么效果。-_-!
//讀取圖片
$im=imagecreatefrompng("demo_1.png");
imagecopyresampled($image,$im,10,20,0,0,128,128,128,128);//合拼圖片
header('Content-type: image/png');
imagepng($image);
imagedestroy($image);
?>
1
2
3
4
5
6
7
8
9
10
11
12
$size=300;
$image=imagecreatetruecolor($size,$size);//創(chuàng)建圖片
$back=imagecolorallocatealpha($image,255,255,255,127);//加透明顏色,其實(shí)好象沒(méi)什么效果。-_-!
//讀取圖片
$im=imagecreatefrompng("demo_1.png");
imagecopyresampled($image,$im,10,20,0,0,128,128,128,128);//合拼圖片
header('Content-type: image/png');
imagepng($image);
imagedestroy($image);
?>
效果是圖片背景變成了黑色。
解決辦法:使用imagecreate()而不是用imagecreatetruecolor()創(chuàng)建圖片。
因?yàn)閕magecreatetruecolor()返回一個(gè)圖像標(biāo)識(shí)符,代表了一幅大小為 x_size 和 y_size 的黑色圖像,
看下幫助手冊(cè)就知道了。
但這種方法仍然有bug,用于png時(shí),png有部分顏色失去,變成了透明。
解決辦法:未知,有知道的告訴我一聲,在下先謝謝了。
3.php生產(chǎn)透明背景圖片
PHP
$wite = ImageColorAllocate($ni,255,255,255);//填充的背景色你可以重新指定,我用的是白色
imagefilledrectangle($ni, 0, 0, $dstW, $dstH, $wite);
ImageColorTransparent($ni, $wite);
?>
1
2
3
4
5
$wite=ImageColorAllocate($ni,255,255,255);//填充的背景色你可以重新指定,我用的是白色
imagefilledrectangle($ni,0,0,$dstW,$dstH,$wite);
ImageColorTransparent($ni,$wite);
?>
不過(guò)現(xiàn)在的方法還不是太理想。
2的bug解決辦法
PHP
//創(chuàng)建透明畫(huà)布
$im_out =imagecreatetruecolor($imgcreat_x, $imgcreat_y);
imagealphablending($im_out, true);
imagesavealpha($im_out, true);
$trans_colour = imagecolorallocatealpha($im_out, 0, 0, 0, 127);
imagefill($im_out, 0, 0, $trans_colour);
ImageCopyResized($im_out, $im, 0,0, 0, 0, $img_x, $img_y, $img[0], $img[1]);
imagepng($im_out);
?>
1
2
3
4
5
6
7
8
9
10
//創(chuàng)建透明畫(huà)布
$im_out=imagecreatetruecolor($imgcreat_x,$imgcreat_y);
imagealphablending($im_out,true);
imagesavealpha($im_out,true);
$trans_colour=imagecolorallocatealpha($im_out,0,0,0,127);
imagefill($im_out,0,0,$trans_colour);
ImageCopyResized($im_out,$im,0,0,0,0,$img_x,$img_y,$img[0],$img[1]);
imagepng($im_out);
?>
以下是處理透明的3個(gè)必須了解的函數(shù)
imagealphablending
此函數(shù),開(kāi)啟或關(guān)閉一個(gè)真彩色圖像資源的混色模式。開(kāi)啟與關(guān)閉混合模式有什么區(qū)別呢?如果不涉及透明度的問(wèn)題,兩個(gè)模式?jīng)]什么區(qū)別,但是如果是在一張畫(huà)布上畫(huà)一條透明顏色的線,不同的混合模式將出現(xiàn)不同的效果,如果混合模式開(kāi)啟,則透明線的顏色會(huì)與原背景中的顏色疊加,計(jì)算出新的顏色,顯示出來(lái),如果混合模式關(guān)閉,則透明線的顏色直接覆蓋到畫(huà)布中對(duì)應(yīng)位置的顏色值。
簡(jiǎn)單來(lái)說(shuō),開(kāi)啟混合模式,顏色疊加,關(guān)閉混合模式,顏色覆蓋。
imagecolorallocatealpha
類(lèi)似于拾色器的功能,就是生成一個(gè)顏色, 的行為和 imagecolorallocate?相同,但多了一個(gè)額外的透明度參數(shù) alpha,其值從 0 到 127。0 表示完全不透明,127 表示完全透明。
imagesavealpha
設(shè)置標(biāo)記以在保存 PNG 圖像時(shí)保存完整的 alpha 通道信息,如果你想保存一個(gè)透明的png圖標(biāo),這個(gè)函數(shù)是必要的。
給個(gè)生成300×300完全透明PNG的例子,
PHP
$block=imagecreatetruecolor(300,300);//建立一個(gè)畫(huà)布
$c=imagecolorallocatealpha($block , 0 , 0 , 0 ,127);//拾取一個(gè)完全透明的顏色
imagealphablending($block ,false);//關(guān)閉混合模式,以便透明顏色能覆蓋原畫(huà)布
imagefill($block , 0 , 0, $c);//填充
imagesavealpha($block ,true);//設(shè)置保存PNG時(shí)保留透明通道信息
imagepng($block ,'e.png');//生成圖片
?>
1
2
3
4
5
6
7
8
$block=imagecreatetruecolor(300,300);//建立一個(gè)畫(huà)布
$c=imagecolorallocatealpha($block,0,0,0,127);//拾取一個(gè)完全透明的顏色
imagealphablending($block,false);//關(guān)閉混合模式,以便透明顏色能覆蓋原畫(huà)布
imagefill($block,0,0,$c);//填充
imagesavealpha($block,true);//設(shè)置保存PNG時(shí)保留透明通道信息
imagepng($block,'e.png');//生成圖片
?>
另一種建立透明PNG的方法 , 使用imagecolortransparent設(shè)置圖片的透明色屬性,也就是把圖片上的某個(gè)顏色設(shè)置成透明色。
PHP
$block= imagecreatetruecolor(300 ,300);//建立一個(gè)真彩色畫(huà)布
$white= imagecolorallocate($block , 255 , 255 ,255);//拾取白色
imagefill($block , 0 , 0, $white);//把畫(huà)布染成白色
imagecolortransparent($block ,$white );//把圖片中白色設(shè)置為透明色
//imagesavealpha($block , false);
imagepng($block ,'e.png');//生成圖片
?>
1
2
3
4
5
6
7
8
$block=imagecreatetruecolor(300,300);//建立一個(gè)真彩色畫(huà)布
$white=imagecolorallocate($block,255,255,255);//拾取白色
imagefill($block,0,0,$white);//把畫(huà)布染成白色
imagecolortransparent($block,$white);//把圖片中白色設(shè)置為透明色
//imagesavealpha($block , false);
imagepng($block,'e.png');//生成圖片
?>
總結(jié)
以上是生活随笔為你收集整理的php 网页 透明背景图片,php 处理透明背景的图片时的问题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
                            
                        - 上一篇: CPU寻址范围(寻址空间)一系列问题
 - 下一篇: oracle支持非关系数据库,Oracl