imagewebp

(PHP 5 >= 5.4.0, PHP 7, PHP 8)

imagewebp将 WebP 图像输出到浏览器或文件

描述

imagewebp(GdImage $image, resource|string|null $file = null, int $quality = -1): bool

输出或保存给定 image 的 WebP 版本。

参数

image

一个 GdImage 对象,由图像创建函数之一返回,例如 imagecreatetruecolor()

file

要保存文件的路径或打开的流资源(在此函数返回后会自动关闭)。如果未设置或为 null,则原始图像流将直接输出。

quality

quality 的范围从 0(最差质量,文件大小更小)到 100(最佳质量,文件大小更大)。

返回值

成功时返回 true,失败时返回 false

警告

但是,如果 libgd 无法输出图像,此函数将返回 true

变更日志

版本 描述
8.0.0 image 现在期望一个 GdImage 实例;以前,期望一个有效的 gd resource

示例

示例 #1 保存 WebP 文件

<?php
// 创建一个空白图像并添加一些文本
$im = imagecreatetruecolor(120, 20);
$text_color = imagecolorallocate($im, 233, 14, 91);

imagestring($im, 1, 5, 5, 'WebP with PHP', $text_color);

// 保存图像
imagewebp($im, 'php.webp');

// 释放内存
imagedestroy($im);
?>

添加注释

用户贡献的注释 7 个注释

29
vinicius dot sizilio at gmail dot com
4 年前
要将 PNG 图像转换为 Webp,我们可以这样做

<?php

// 图像
$dir = 'img/countries/';
$name = 'brazil.png';
$newName = 'brazil.webp';

// 创建并保存
$img = imagecreatefrompng($dir . $name);
imagepalettetotruecolor($img);
imagealphablending($img, true);
imagesavealpha($img, true);
imagewebp($img, $dir . $newName, 100);
imagedestroy($img);

?>
31
Khalyomede
5 年前
截至今天(2019 年 1 月底),WebP 现在已在所有主要浏览器(Edge、Chrome、Firefox、Opera)中得到支持。
22
JSix
2 年前
将任何图像保存到 Webp 的函数

public static function webpImage($source, $quality = 100, $removeOld = false)
{
$dir = pathinfo($source, PATHINFO_DIRNAME);
$name = pathinfo($source, PATHINFO_FILENAME);
$destination = $dir . DIRECTORY_SEPARATOR . $name . '.webp';
$info = getimagesize($source);
$isAlpha = false;
if ($info['mime'] == 'image/jpeg')
$image = imagecreatefromjpeg($source);
elseif ($isAlpha = $info['mime'] == 'image/gif') {
$image = imagecreatefromgif($source);
} elseif ($isAlpha = $info['mime'] == 'image/png') {
$image = imagecreatefrompng($source);
} else {
return $source;
}
if ($isAlpha) {
imagepalettetotruecolor($image);
imagealphablending($image, true);
imagesavealpha($image, true);
}
imagewebp($image, $destination, $quality);

if ($removeOld)
unlink($source);

return $destination;
}
6
day4gerard
4 年前
Safari 尚未支持 WebP,尽管他们正在对其进行实验。

查看 https://caniuse.cn/#search=webp 以获取最新的支持信息。
1
Sam
3 年前
Mac 上的 Safari 现在提供有限的支持(限于 Big Sur 或更高版本上的 Safari 14+)

iOS 14.4 及更高版本上的 Safari 提供完全支持
-8
orangefish at sogetthis dot com
11 年前
WebP 是一种很棒的文件格式,但它基本上只得到 Chrome 的支持。对于带有透明度的 WebP 文件,有必要为其他浏览器提供 PNG 后备(否则它将无法在 iOS、Firefox、IE 等中工作)。

带 alpha 的常规真彩色 PNG 会生成相当大的文件,但可以通过 pngquant(一个命令行实用程序)创建一种特殊的更小的 PNG 文件变体。

如果您在服务器上安装了 pngquant 1.8(只需从官方 pngquant 网站获取软件包),那么您可以创建更小的后备图像(质量比 PHP 的 libgd 更好)

<?php

/**
* 使用 pngquant 1.8 或更高版本优化 PNG 文件(减小 24 位/32 位 PNG 图像的文件大小)。
*
* 您需要在服务器上安装 pngquant 1.8.x(旧版本 1.0 不起作用)。
* 在 http://pngquant.org 上有适用于 Debian/Ubuntu 的软件包和适用于其他发行版的 RPM 包。
*
* @param $path_to_png_file string - 任何 PNG 文件的路径,例如 $_FILE['file']['tmp_name']
* @param $max_quality int - 转换质量,有效值从 60 到 100(数字越小,文件越小)
* @return string - 转换后 PNG 文件的内容
*/
function compress_png($path_to_png_file, $max_quality = 90)
{
if (!
file_exists($path_to_png_file)) {
throw new
Exception("文件不存在: $path_to_png_file");
}

// 保证质量不会低于此。
$min_quality = 60;

// '-' 使其使用 stdout,需要保存到 $compressed_png_content 变量
// '<' 使其从给定的文件路径读取
// escapeshellarg() 使其在任何路径下安全使用
$compressed_png_content = shell_exec("pngquant --quality=$min_quality-$max_quality - < ".escapeshellarg( $path_to_png_file));

if (!
$compressed_png_content) {
throw new
Exception("无法转换为压缩的 PNG。服务器上是否安装了 pngquant 1.8+?");
}

return
$compressed_png_content;
}
?>

例如,当用户上传 PNG 文件时

<?php

$read_from_path
= $_FILE['file']['tmp_name'];
$save_to_path = "uploads/compressed_file.png";

$compressed_png_content = compress_png($read_from_path);
file_put_contents($save_to_path, $compressed_png_content);

// 您不需要 move_uploaded_file()。

// 对于 webp:
imagewebp(imagecreatefrompng($read_from_path), $save_to_path + ".webp");
?>

然后,您可以在 Chrome 和发送 Accept: image/webp 的浏览器中使用带有 .webp 版本的 URL,而对于其他浏览器(以及所有浏览器都将获得小文件!)使用 .png。
-8
mauro dot ludovico dot colella at gmail dot com
9 years ago
也可以将 WebP 图像的 png 替换创建推迟到客户端,特别是 libwebpjs 库可以实现透明转换。
To Top