ndfweb.cn

php處理png透明背景的圖片問題


2021-05-06 19:47:54 (4039)



php處理png透明背景的圖片問題


直接讀取有透明背景的PNG格式文件

圖片透明部分變成了黑色

php生成透明背景圖片

處理透明的3個必須了解的函數

imagealphablending

imagecolorallocatealpha

imagesavealpha

直接讀取有透明背景的PNG格式文件


直接讀取有透明背景的PNG格式文件,然後直接輸出,背景變成了黑色,gif則沒有這種情況。

解決方法:使用 imagesavealpha ($image, true),此函數是針對png格式的.


<?php



$im=imagecreatefrompng("qipa250com.png");


imagesavealpha($im, true);//設置標記以在保存 PNG 圖像時保存完整的 alpha 通道信息。


header('Content-type: image/png');


imagepng($im);


imagedestroy($im);


?>


注意一點:不是所有的瀏覽器都支持 alpha 通道,如果在你的瀏覽器上碰到問題,試著用兼容 alpha 通道的瀏覽器(例如最新版的 Mozilla)重新加載腳本。

經測試,在IE中顯示效果不理想(但圖片仍然是透明的,保存下來看下就知道),背景變成了灰色

圖片透明部分變成了黑色


在處理(比如縮小,剪切)有透明背景的gif和png圖片然後輸出時,圖片透明部分變成了黑色



<?php

$size = 300;

$image=imagecreatetruecolor($size, $size);//創建圖片

$back =imagecolorallocatealpha($image, 255, 255, 255,127);//加透明顏色,其實好象沒什麼效果。-_-!

//讀取圖片

$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()創建圖片。

因為imagecreatetruecolor()返回一個圖像標識符,代表了一幅大小為 x_size 和 y_size 的黑色圖像,

看下幫助手冊就知道了。

但這種方法仍然有bug,用於png時,png有部分顏色失去,變成了透明。

解決辦法:未知,有知道的告訴我一聲,在下先謝謝了。

php生成透明背景圖片


第一種方法:



<?php


$wite = ImageColorAllocate($ni,255,255,255);//填充的背景色你可以重新指定,我用的是白色


imagefilledrectangle($ni, 0, 0, $dstW, $dstH, $wite);


ImageColorTransparent($ni, $wite);


?>



第二種方法:



<?php


    //創建透明畫布


    $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個必須了解的函數


imagealphablending


此函數,開啟或關閉一個真彩色圖像資源的混色模式。開啟與關閉混合模式有什麼區別呢?如果不涉及透明度的問題,兩個模式沒什麼區別,但是如果是在一張畫布上畫一條透明顏色的線,不同的混合模式將出現不同的效果,如果混合模式開啟,則透明線的顏色會與原背景中的顏色疊加,計算出新的顏色,顯示出來,如果混合模式關閉,則透明線的顏色直接覆蓋到畫布中對應位置的顏色值。


簡單來說,開啟混合模式,顏色疊加,關閉混合模式,顏色覆蓋。


imagecolorallocatealpha


類似於拾色器的功能,就是生成一個顏色, 的行為和 imagecolorallocate 相同,但多了一個額外的透明度參數 alpha,其值從 0 到 127。0 表示完全不透明,127 表示完全透明。


imagesavealpha


設置標記以在保存 PNG 圖像時保存完整的 alpha 通道信息,如果你想保存一個透明的png圖標,這個函數是必要的。


給個生成300×300完全透明PNG的例子,



<?PHP


$block=imagecreatetruecolor(300,300);//建立一個畫布


$c=imagecolorallocatealpha($block , 0 , 0 , 0 ,127);//拾取一個完全透明的顏色


imagealphablending($block ,false);//關閉混合模式,以便透明顏色能覆蓋原畫布


imagefill($block , 0 , 0, $c);//填充


imagesavealpha($block ,true);//設置保存PNG時保留透明通道信息


imagepng($block ,'e.png');//生成圖片


?>



另一種建立透明PNG的方法 , 使用imagecolortransparent設置圖片的透明色屬性,也就是把圖片上的某個顏色設置成透明色。



<?PHP


$block= imagecreatetruecolor(300 ,300);//建立一個真彩色畫布


$white= imagecolorallocate($block , 255 , 255 ,255);//拾取白色


imagefill($block , 0 , 0, $white);//把畫布染成白色


imagecolortransparent($block ,$white );//把圖片中白色設置為透明色


//imagesavealpha($block , false);


imagepng($block ,'e.png');//生成圖片


?>

本文版权:http://www.ndfweb.cn/news-854.html
  NDF俱乐部
  国际域名注册
  建站咨询
简体中文 NDF网站建设淘宝店 | ICO图标在线生成 | 外贸网站建设 | 联系我们
©2007-2024 NDF Corporation 鲁ICP备08005967号 Sitemap - RSSRSS订阅