PHP Conference Japan 2024

imagesavealpha

(PHP 4 >= 4.3.2, PHP 5, PHP 7, PHP 8)

imagesavealpha當儲存影像時是否保留完整的 Alpha 色版資訊

描述

imagesavealpha(GdImage $image, bool $enable): bool

imagesavealpha() 設定一個旗標,該旗標決定當儲存影像時是否保留完整的 alpha 色版資訊(相對於單色透明度)。這僅適用於支援完整 alpha 色版資訊的影像格式,即 PNGWebPAVIF

注意 imagesavealpha() 僅對 PNG 影像有意義,因為 WebPAVIF 總是儲存完整的 alpha 色版。不建議依賴此行為,因為它未來可能會變更。因此,即使對於 WebPAVIF 影像,也應明確呼叫 imagesavealpha()

必須先停用 Alpha 混合處理 (imagealphablending($im, false)) 才能保留 alpha 色版。

參數

image

一個 GdImage 物件,由影像建立函式之一所傳回,例如 imagecreatetruecolor()

enable

是否儲存 alpha 色版。預設為 false

回傳值

成功時回傳 true,失敗時回傳 false

變更日誌

版本 描述
8.0.0 image 現在需要一個 GdImage 實例;先前,需要一個有效的 gd resource

範例

範例 #1 基本的 imagesavealpha() 用法

<?php
// 載入一個帶有 alpha 色版的 png 影像
$png = imagecreatefrompng('./alphachannel_example.png');

// 關閉 alpha 混合處理
imagealphablending($png, false);

// 執行所需的操作

// 設定 alpha 旗標
imagesavealpha($png, true);

// 將影像輸出到瀏覽器
header('Content-Type: image/png');

imagepng($png);
imagedestroy($png);
?>

另請參閱

新增筆記

使用者提供的筆記 2 筆筆記

20
ray hatfield
13 年前
經過多次嘗試和錯誤以及咬牙切齒,我終於弄清楚如何將帶有 8 位元 alpha 的 png 合成到 jpg 上。這對我來說並不顯而易見,所以我認為我應該分享。希望這對您有所幫助。

我正在使用它來建立帶有邊框的縮圖影像

<?php
// 載入邊框影像(帶有 8 位元透明度的 png)
$frame = imagecreatefrompng('path/to/frame.png');

// 載入縮圖影像
$thumb = imagecreatefromjpeg('path/to/thumbnail.jpg');

// 取得邊框的尺寸,我們也將用於
// 合成後的最終影像。
$width = imagesx( $frame );
$height = imagesy( $frame );

// 建立目標/輸出影像。
$img=imagecreatetruecolor( $width, $height );

// 在目標影像上啟用 alpha 混合處理。
imagealphablending($img, true);

// 配置一個透明的顏色並用它填充新影像。
// 沒有這個,影像將會具有黑色的背景而不是透明的。
$transparent = imagecolorallocatealpha( $img, 0, 0, 0, 127 );
imagefill( $img, 0, 0, $transparent );

// 將縮圖複製到輸出影像中。
imagecopyresampled($img,$thumb,32,30,0,0, 130, 100, imagesx( $thumb ), imagesy( $thumb ) );

// 將邊框複製到輸出影像中(在縮圖的頂層)。
imagecopyresampled($img,$frame,0,0,0,0, $width,$height,$width,$height);

imagealphablending($img, false);

// 儲存 alpha
imagesavealpha($img,true);

// 發出影像
header('Content-type: image/png');
imagepng( $img );

// 處置
imagedestroy($img);

// 完成。
exit;
?>
-1
phil at unabacus dot net
16 年前
「doggz at mindless dot com」留下的評論會導致透明影像圖層重複 - AlphaImageLoader 會將影像載入,如同在 <img> 元素之上的一個浮動圖層 - 所以你的影像會重複顯示。因此,別以為你的 PHP 程式碼出了什麼奇怪的問題,這是瀏覽器的問題 ;)

最簡單(雖然不是最好)的解決方法是使用 CSS 的 background 屬性而不是 image 的 src 屬性 - 因為目前支援的 CSS 還無法動態更改影像的 src。

<div style="width:200px; height:200px; background: url(my-trans-image.php); *background:url(); *filter:progid
DXImageTransform.Microsoft.AlphaImageLoader(src='my-trans-image.php', sizingMethod='scale');"></div>

以上程式碼(雖然不美觀)能讓任何正常的瀏覽器都將影像作為背景載入,因為它們會忽略帶星號 (*) 的 CSS 項目,並且應該原生支援 Alpha PNG。IE 瀏覽器會讀取帶星號的項目,清除背景,同時在其上應用 AlphaLoader。顯然,你需要知道影像的寬度和高度,你可以使用 getimagesize() 取得,或直接硬編碼。

需知的缺點

1. 除非使用者啟用「列印時顯示背景」,否則網頁列印時不會顯示你的影像。

2. 你無法伸縮背景影像 - 如果你更改 div 的尺寸使其與影像不同,在 IE 中你會因為 'scale' 屬性而拉伸影像 (你可以為了符合標準而將 'scale' 改成 'crop'),但在其他瀏覽器中你會裁切影像。

3. 大多數瀏覽器對影像和背景的處理方式不同,包括載入優先順序以及使用者與它們互動的方式。

其他選項

其他方法則是使用 JavaScript 或在伺服器端進行瀏覽器偵測。
To Top