为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
大话西游666 2021-12-24 09:12:21
我需要将图像(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
查看完整描述

3 回答

?
手掌心

TA贡献1942条经验 获得超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库,因此确实推崇的作品,如果在以后的PHP版本测试不是您正在使用,特别是在我测试了7.3.0,但您的版本后,在早期的版本可能工作。


查看完整回答
反对 回复 2021-12-24
?
qq_花开花谢_0

TA贡献1835条经验 获得超7个赞

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


查看完整回答
反对 回复 2021-12-24
?
胡说叔叔

TA贡献1804条经验 获得超8个赞

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


$im = imagecreatefrompng($infilename);

imagesavealpha($im, true);

imagewebp($im, $outfilename);


查看完整回答
反对 回复 2021-12-24
  • 3 回答
  • 0 关注
  • 325 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号