idiotbaka

使用PHP脚本批量转换webp文件为png文件
WebP是一种主要应用于网页上的图片格式,由谷歌推出。目的是能够更有效的压缩图片,来节省图片传输所消耗的时间和服务...
扫描右侧二维码阅读全文
20
2020/04

使用PHP脚本批量转换webp文件为png文件

1280px-WebPLogo.svg.png
WebP是一种主要应用于网页上的图片格式,由谷歌推出。
目的是能够更有效的压缩图片,来节省图片传输所消耗的时间和服务器带宽。
但是毕竟应用场景有限,所以有时候需要将webp转换为png图片。

引言

在试了几个能够转换webp为png的网站后,发现了几个问题。

  1. 转换为png后,透明图层变成了白色图层,这个是不希望的。
  2. 不支持批量转换,或者设置了批量转换门槛(比如收费,限制同时转换数量等)。

在懒得下载一个专门转换格式用的软件情况下,我决定自己动手造个轮子。

安装官方包

首先需要webp包,谷歌提供了官方包,可以在这里下载:
https://storage.googleapis.com/downloads.webmproject.org/releases/webp/index.html
不过ubuntu下可以直接通过apt命令安装webp包,centos应该也有,很方便(以ubuntu举例):

apt update
apt install webp

安装后,输入 dwebp ,如果返回的不是 dwebp: command not found,那么就安装成功了。
dwebp pic.webp -o pic.png就能将webp文件转换为png文件。

使用PHP脚本

接下来让他能够批量转换,我使用了世界上最好的语言(PHP)编写脚本:

// 获取原始文件夹名称
if(!isset($argv[1])) {
    die('Please enter the original folder path.'.PHP_EOL);
}
// 判断文件夹路径是绝对路径还是相对路径
if(substr($argv[1], 0, 1) == '/') {
    $path_folder = $argv[1];
}
else {
    $path_folder = __DIR__.'/'.$argv[1];
}
if(substr($argv[1], -1) != '/') {
    $path_folder .= '/';
}
// 判断文件夹是否存在
if(!is_dir($path_folder)) {
    die('Original folder does not exist.'.PHP_EOL);
}
// 创建结果输出文件夹
$output_folder = __DIR__.'/'.time().'-png';
if(!mkdir($output_folder)) {
    die('Failed to create folder, please check the permissions of the current path.'.PHP_EOL);
}
// 遍历原始文件夹
$folder = scandir($path_folder);
foreach($folder as $webp_file) {
    // 获取文件扩展名为.webp的的文件
    if(substr($webp_file, -4) == '.webp') {
        // 除扩展名外,输出的文件名和输入文件名相同
        $result_name = str_replace('.webp', '.png', $webp_file);
        // 调用shell命令
        $run_result = shell_exec('dwebp '.$path_folder.$webp_file.' -o '.$output_folder.'/'.$result_name);
    }
}
die('Successful conversion, folder path: '.$output_folder.PHP_EOL);

用法很简单,将以上代码放入php文件中,通过cli方式调用,传参要转换的文件夹(绝对路径和相对路径皆可),就可以把文件夹内所有webp转换为png了,举例:

php webp_converter.php webp_folder

php webp_converter.php /home/webp_folder

注意事项

  1. 脚本会在php文件目录下创建一个输出png图片的文件夹,请确保当前php路径有写入权限。
  2. 脚本会调用shell_exec函数,所以如果发现转换失败了,请检查是否开启了PHP的安全模式。
  3. 如果需要用sudo php ...的方式来调用,代码中的$argv[1]需要改成$argv[2],因为传参的顺序改变了。
Last modification:April 20th, 2020 at 05:54 pm
本文采用 知识共享署名 4.0 国际许可协议进行许可
可自由转载、引用,但需署名作者且注明文章出处
If you think my article is useful to you, please feel free to appreciate

Leave a Comment