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 notes

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