如何将png文件转换为webp文件

时间:2019-09-02 13:03:35

标签: php wordpress image

我需要将图像(png)转换为(webp)文件。

上传 png 文件后,已生成 webp 图片,但 webp 文件未复制< strong> png 文件,而是创建黑色背景。

这是我的php代码:

$type = wp_check_filetype($file, null);
$ext = $type['ext'];
if ($ext === 'png') {
    $im = imagecreatefrompng($file);
    imagepalettetotruecolor($im);
    $webp = imagewebp($im, str_replace('png', 'webp', $file));
}
imagedestroy($im);
  

PHP版本为5.6

4 个答案:

答案 0 :(得分:1)

在7.3.0上测试-有效。

免责声明:可能仅在更高版本或某些PHP版本上有效。

仅在5.6.15(无效,黑色背景)和7.3.0(有效,透明背景)上进行了测试。

代码如下:

// get png in question

$pngimg = imagecreatefrompng($file);

// get dimens of image

$w = imagesx($pngimg);
$h = imagesy($pngimg);;

// create a canvas

$im = imagecreatetruecolor ($w, $h);
imageAlphaBlending($im, false);
imageSaveAlpha($im, true);

// By default, the canvas is black, so make it transparent

$trans = imagecolorallocatealpha($im, 0, 0, 0, 127);
imagefilledrectangle($im, 0, 0, $w - 1, $h - 1, $trans);

// copy png to canvas

imagecopy($im, $pngimg, 0, 0, 0, 0, $w, $h);

// lastly, save canvas as a webp

imagewebp($im, str_replace('png', 'webp', $file));

// done

imagedestroy($im);  

编辑1. ***证明

PHP GD库依赖libgd库。

链接:

https://github.com/libgd/libgd

保存时的相关代码(文件:gd_webp.c),摘录显示存在时对Alpha通道的尊重:

            c = im->tpixels[y][x];
            a = gdTrueColorGetAlpha(c);
            if (a == 127) {
                a = 0;
            } else {
                a = 255 - ((a << 1) + (a >> 6));
            }
            *(p++) = gdTrueColorGetRed(c);
            *(p++) = gdTrueColorGetGreen(c);
            *(p++) = gdTrueColorGetBlue(c);
            *(p++) = a;

关于static int _gdImageWebpCtx (gdImagePtr im, gdIOCtx * outfile, int quality)

我提供的PHP代码基于GD库中确实尊重alpha的事实,因此,如果在比您使用的更高的PHP版本中进行了测试,就可以使用,特别是我在7.3.0中进行了测试但可能会在您的版本之后的早期版本中起作用。

答案 1 :(得分:0)

您可能必须启用Alpha通道并保存它。也许试试这个:

$ext = $type['ext'];
if ($ext === 'jpg' || $ext === 'jpeg') {
    $im = imagecreatefromjpeg($file);
    $webp = imagewebp($im, str_replace($ext, 'webp', $file), 70);
} elseif ($ext === 'png') {
    $im = imagecreatefrompng($file);
    imagepalettetotruecolor($im);

    imageAlphaBlending($im, true); // alpha channel
    imageSaveAlpha($im, true); // save alpha setting

    $webp = imagewebp($file, str_replace('png', 'webp', $file));
}
imagedestroy($im);
  

PHP版本为5.6

答案 2 :(得分:0)

只需添加:

imagealphablending($im, true);
imagesavealpha($im, true);

在$ im = imagecreatefrompng($ file)之间;和imagewebp(..

$type = wp_check_filetype($file, null);
$ext = $type['ext'];
if ($ext === 'png') {
  $im = imagecreatefrompng($file);
  imagealphablending($im, true);
  imagesavealpha($im, true);
  $webp = imagewebp($im, str_replace('png', 'webp', $file));
}
imagedestroy($im);

将图片放在类似的位置

<html>
  <body style="background-color:red;">
    <img src="url_of_your_img.webp">
  </body>
</html>

您应该以正确的方式查看您的webp

答案 3 :(得分:0)

如果输出格式支持全 alpha 透明度,则无需复制源图像。相反,在保存时告诉 GD 保留 alpha 通道就足够了:

f_name = 'Jon'
l_name = 'Smith'

print(f'"{f_name}", "{l_name}"')
print('"{f_name}", "{l_name}"'.format(f_name=f_name, l_name=l_name))