茫茫網海中的冷日 - 對這文章發表回應
茫茫網海中的冷日
         
茫茫網海中的冷日
發生過的事,不可能遺忘,只是想不起來而已!
 恭喜您是本站第 1729111 位訪客!  登入  | 註冊
主選單

Google 自訂搜尋

Goole 廣告

隨機相片
IMG_00017.jpg

授權條款

使用者登入
使用者名稱:

密碼:


忘了密碼?

現在就註冊!

對這文章發表回應

發表限制: 非會員 可以發表

發表者: 冷日 發表時間: 2012/9/23 8:08:32
php 處理透明背景的圖片時的問題

PHP圖像處理之透明背景的gif和png圖片的一些問題

1,直接讀取有透明背景的PNG格式文件,然後直接輸出,背景變成了黑色,gif則沒有這種情況。
解決方法:使用 imagesavealpha ($image, true),此函數是針對png格式的.
<?php
$im=imagecreatefrompng("demo_1.png");
imagesavealpha($im, true);//設置標記以在保存 PNG 圖像時保存完整的 alpha 通道信息。
header('Content-type: image/png');
imagepng($im);
imagedestroy($im);
?>

注意一點:不是所有的瀏覽器都支持 alpha 通道,如果在你的瀏覽器上碰到問題,試著用兼容 alpha 通道的瀏覽器(例如最新版的 Mozilla)重新加載腳本。
經測試,在IE中顯示效果不理想(但圖片仍然是透明的,保存下來看下就知道),背景變成了灰色.

2,在處理(比如縮小,剪切)有透明背景的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有部分顏色失去,變成了透明。
解決辦法:未知,有知道的告訴我一聲,在下先謝謝了。

3.php生產透明背景圖片
<?php
$wite = ImageColorAllocate($ni,255,255,255);//填充的背景色你可以重新指定,我用的是白色
imagefilledrectangle($ni, 0, 0, $dstW, $dstH, $wite);
ImageColorTransparent($ni, $wite);
?>

不過現在的方法還不是太理想。

2的bug解決辦法
<?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');//生成圖片
?>



原文出處:php 处理透明背景的图片时的问题 - 周超的博客-小贤看世界
內容圖示
url email imgsrc image code quote
樣本
bold italic underline linethrough   












 [詳情...]
validation picture

注意事項:
預覽不需輸入認證碼,僅真正發送文章時才會檢查驗證碼。
認證碼有效期10分鐘,若輸入資料超過10分鐘,請您備份內容後,重新整理本頁並貼回您的內容,再輸入驗證碼送出。

選項

Powered by XOOPS 2.0 © 2001-2008 The XOOPS Project|