【问题标题】:How to convert png file to webp file如何将png文件转换为webp文件
【发布时间】:2020-01-05 12:29:07
【问题描述】:

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

上传png文件后,webp图片已经生成,但是webp文件没有复制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

【问题讨论】:

  • 谢谢,但您知道如何在不使用任何库的情况下解决此问题吗?
  • 不,我不知道在没有任何库的情况下实现这个。
  • @JordanLipana 我有一个解决方案。但这取决于足够高的 PHP 版本。很快就会发布。我首先在 5.6 上进行了测试——不行。然后在 7.2(更正 7.3.0)——工作。将再次检查我在 5.6 上的更改,然后如果 php ver 重要,将发布带有免责声明的解决方案。更新:已发布解决方案。

标签: php wordpress image


【解决方案1】:

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

$im = imagecreatefrompng($infilename);
imagesavealpha($im, true);
imagewebp($im, $outfilename);

【讨论】:

    【解决方案2】:

    只需添加:

    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

    【讨论】:

    • > 只需添加imagealphablending($im, true); imagesavealpha($im, true);。神话。根据 php.net 必须是一个或另一个:必须禁用 Alphablending (imagealphablending($im, false)) 以首先保留 alpha 通道。来自php.net/manual/en/function.imagesavealpha.php
    【解决方案3】:

    在 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 中测试但可能在您的版本之后的早期版本中工作。

    【讨论】:

    • 谢谢,但我的 PHP 版本是 5.6
    • @JordanLipana 我的解决方案从技术上解决了您的问题。然而,我们将看到这是如何发生的。 Jordan,5.6 中的 GD 库根本不支持它。 PHP 5.6 中的那个 GD 版本不尊重 alpha 模式。谷歌文档 3 种模式。就我的测试而言,PHP 5.6 没有使用 webp 的 alpha 通道模式。
    • 听着,去年年底,我根据 GD 库拼凑了优惠券的最终图像,所以当我看到你的问题时,我跳了起来。我检查了你的问题的 C 源代码,看看是否尊重 alpha:它是最新版本。我没有试图追踪它用于 PHP 5.6 的内容。那时 PHP 可能不支持 alpha 版本,否则为什么迄今为止任何人都没有解决该版本的问题?
    • 您好,您是否有链接说明 PHP 5.6 中的 GD 库不支持将 png 转换为 webp?我需要告诉我的团队。
    • @JordanLipana 在提供证据之前了解我的主张。 PHP 5.6 支持保存到 webp。这是事实。所以我不能像你所说的那样声称这不是真的。然而,我要说的是它不尊重 alpha 通道,这是想要透明(非黑色)背景的结果。
    【解决方案4】:

    您可能必须启用 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

    【讨论】:

    • 谢谢,但代码不会将 png 转换为 webp。我还修改了imagewebp($file, str_replace('png', 'webp', $file));,改成imagewebp($im, str_replace('png', 'webp', $file));,结果还是一样,就是把透明度变成了黑色。
    • 我有一个解决方案。但这取决于足够高的 PHP 版本。很快就会发布。我首先在 5.6 上进行了测试——不行。然后在 7.2 - 工作。将再次检查我在 5.6 上的更改,然后如果 php 版本很重要,将发布带有免责声明的解决方案。
    猜你喜欢
    • 1970-01-01
    • 2022-11-30
    • 1970-01-01
    • 2021-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-29
    • 2019-04-23
    相关资源
    最近更新 更多