2024 年 PHP 日本大会

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 资源

示例

示例 #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 条注释

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;
?>
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”属性 - 为了标准化,您可以将其更改为“crop”),但在任何其他浏览器中都会裁剪它。

3. 大多数浏览器对图像和背景的处理方式不同,包括加载优先级和用户与其交互的方式。

其他选项

其他方法需要使用JavaScript或服务器端的浏览器检测。
To Top