用php语言把网站图片转为webp格式的前后端代码

作者:魔道寒武纪     信息来源:互联网     发布时间:2023-12-27     点击数:50    

原文地址:https://blog.csdn.net/weixin_41797287/article/details/80288759


基本原理:前端使用ajax上传图片,后台php接收图片数据,进行处理,使用php扩展gd库将图片格式转换成webp,返回给前端。当然不使用ajax也可以,不是重点。ajax异步请求对用户更友好一些。300K左右的图片会被压缩2/3,等待时间不到1s。
技术难点:php,ajax异步请求,gd库。base64编码,主要用于提升性能。
前端上传代码如下:

<!DOCTYPE html>

<html>

<head>

 <meta charset="UTF-8">

 <title>图片(jpg,jpeg,png)转webp</title>

 <style>

  .center{

   text-align: center;

  }

  .bt{

   font-size: 25px;

   font-weight: 700;

  }

  .xz{

   color: red;

  }

  .loading{

   display:none;

  }

 </style>

</head>

<body>

 <section>

  <p class="bt center">图片(jpg/jpeg/png)转webp格式</p>

 </section>

 <section><!-- 业务核心代码 -->

  <form id="form1">

   <input type="file" multiple name="file" accept="image/png,image/gif,image/jpg,image/jpeg">

   <input type="button" value="提交" onclick="loadXMLDoc()" disabled="true">

  </form>

  <br>

  <div>

   <img src="loading.gif" alt="loading" width="200" height="200">

   <img id="myDiv" src="" width="300">

   <p><a id="xiazai" href="" download="webp.webp">点击下载</a>或者右击另存为,保存图片</p>  

  </div>  

 </section>

 <script>

 //设置未选择上传文件时,禁用提交按钮

 var a = document.getElementsByTagName('input')[0];

 var b = document.getElementsByTagName('input')[1];

 a.oninput = function(){

  if (a!=null&&a!="") {

   b.disabled = false;

  }

 }  

 // ajax异步请求服务器

 function loadXMLDoc()

 { 

  var loading = document.getElementsByClassName('loading')[0];

  loading.style.display = "inline";

  var form=document.getElementById("form1");

        var fd =new FormData(form);

 var xmlhttp;

 if (window.XMLHttpRequest)

 {

  //  IE7+, Firefox, Chrome, Opera, Safari 浏览器执行代码

  xmlhttp=new XMLHttpRequest();

 }

 else

 {

  // IE6, IE5 浏览器执行代码

  xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");

 }

 xmlhttp.onreadystatechange=function()

 {

  if (xmlhttp.readyState==4 && xmlhttp.status==200)

  { 

   loading.style.display = "none";

   document.getElementById("xiazai").href = xmlhttp.responseText;

   document.getElementById("myDiv").src = xmlhttp.responseText;   

  }

 }

 xmlhttp.open("post","webp.php",true);

 xmlhttp.send(fd);

 }

</script>

</body>

</html>

后端PHP代码如下:

<?php 

$name = $_FILES['file']['name'];//文件名

$dizhi = $_FILES['file']['tmp_name'];//图片临时地址,脚本结束则销毁

$houzhui = $_FILES['file']['type'];//图片类型

$str = md5(uniqid(mt_rand(), true));//生成唯一ID  

$zz = base64EncodeImage($houzhui,$dizhi,$str);

echo "data:image/webp;base64,".$zz;

function base64EncodeImage($houzhui,$dizhi,$str)

{

 switch ($houzhui) {

 case 'image/png':

  $im = imagecreatefrompng($dizhi);

  break;

 case 'image/gif':

  $im = imagecreatefromgif($dizhi);

  break;

 case 'image/jpeg':

  $im = imagecreatefromjpeg($dizhi);

  break;

 case 'image/jpg':

  $im = imagecreatefromjpeg($dizhi);

  break; 

 default:

  exit("上传文件格式不正确");

  break;

 }

 header("Content-type:image/webp");

 imagewebp($im,'img/'.$str.'.webp');

 imagedestroy($im);

 return base64_encode(file_get_contents('img/'.$str.'.webp'));//先将文件写入字符串,在进行base64编码

}

?>

webp图片格式是谷歌公司开发的图片格式,它在不明显降低图片显示效果的情况下,可以缩小图片体积,这对减小网站空间占用和快速打开网页很有好处。