1. 云栖社区>
  2. PHP教程>
  3. 正文

关于PHP批量图片格式转换的问题--本文转成webp, 其他过程格式一样

作者:用户 来源:互联网 时间:2017-11-30 17:42:57

问题图片其他转换格式批量过程关于

关于PHP批量图片格式转换的问题--本文转成webp, 其他过程格式一样 - 摘要: 本文讲的是关于PHP批量图片格式转换的问题--本文转成webp, 其他过程格式一样, 最近要把项目中的图片全部生成webp格式, 过程整理一下,    (直接存在本地,或者图片链接存在数据库都可以看看) 首先,肯定是批量处理, 一个php处理不了这么多, 会爆内存的, 个人建议用ajax循环调用php文件 下面贴ajax代

最近要把项目中的图片全部生成webp格式, 过程整理一下,    (直接存在本地,或者图片链接存在数据库都可以看看)

首先,肯定是批量处理, 一个php处理不了这么多, 会爆内存的, 个人建议用ajax循环调用php文件

下面贴ajax代码, 小白和我看看就行, 老人跳过

<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <title>更换图片</title>    <script type="text/javascript" src="./jquery-1.8.3.min.js"></script></head><body>    <button id="but01">点我就帮你转图片</button></body><script type="text/javascript">        var limit = 50;   //每次50条        var offset  = 0;  //偏移量,每次自增50        function toPhp(){            $.ajax({                url: "./sqlsrc.php", //后台处理程序                type: 'POST',                data: {limit: limit, offset: offset},                success:function(data)                {                    if(data)                    {                        offset = offset + 50;                        toPhp(); //根据后台返回的内容,继续调用自己                    }else                    {                        alert('这里是limit---' + limit);                        alert('这里是data---' + data);                        alert('完成');                    }                },                error:function()                {                    alert('失败');                },                dataType:'text'            });        }    $("#but01").click(toPhp);  // 点击按钮执行程序</script></html>

下面是php处理文件, sqlsrc.php主要是处理那种图片路径存在数据库里的,

以下本人是把数据库的图片拉到本地同时生成webp格式/  

你可以直接在项目所在的目录运行此脚本,

注意   sqlsrc.php中的地址要自己拼~     

sqlsrc.php文件如下

关于<a href=PHP批量图片格式转换的问题--本文转成webp, 其他过程格式一样-">关于PHP批量图片格式转换的问题--本文转成webp, 其他过程格式一样-
 1 <?php 2 ini_set ('gd.jpeg_ignore_warning', 1);   //忽略 3 set_time_limit(0);//0表示不限时 4 $dsn='mysql:host=192.168.1.1;dbname=yourdbname'; 5 $user='root'; 6 $password=''; 7 $status=1;  //看个人需要了,这个参数 8  9 $data = $_POST;10 11 try {12     $sql='select thumbnail_pic,small_pic,big_pic from sdb_goods';13     $sql .= " limit {$data['limit']} offset {$data['offset']}"; //  偏移分页查询/14     $dbh=new PDO($dsn,$user,$password);15     $dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);16     $stmt=$dbh->prepare($sql);17     $stmt->bindParam(':status',$status);    //绑定参数的样例, 喜欢参数绑定的看这里,其他人无视这行18     $stmt->execute();19     20     $flag = false; //这里设置一个标识,如果没走while函数, 那么flag依然为false21     while ($row=$stmt->fetch(PDO::FETCH_ASSOC)) {22         $flag = true;  //只要有查询到的内容, flag就会true23         $count = $data['count'];24         25         $ptn = "/http.*?fs_storage/";26         foreach ($row as $k=>$v){27             28             preg_match_all($ptn,$v,$res);29             if(empty($res[0]))30             {31                 continue;32             }33             foreach ($res as $kk=>&$vv)  //这层遍历不需要, 谁可以优化下贴上来.34             {35                 $vv[0] = rtrim($vv[0],'fs_storage');//图片远程路径36                 $vv[0] = rtrim($vv[0],'|');//图片远程路径37                 $ptn01 = "/http.*?/|/";38                 $src = preg_replace($ptn01,'',$vv[0]); //远程路径标准版39                 40                 if(empty($src))41                 {42                     continue;43                 }44                 45                 //这里获取到表中图片的地址, 整理成本地的地址46                 $ptn02 = "/.*com/";47                 $local = preg_replace($ptn02,'.',$src); //本地路径48                 $ptn03 = "/:88/";49                 $local = preg_replace($ptn03,'',$local); //本地路径+文件名50                 $path = pathinfo($local,PATHINFO_DIRNAME);51                 if(empty($path))52                 {53                     continue;54                 }55                 if(!is_dir($path))56                 {57                     mkdir($path,777,true); //58                 }59                60                 61                 //下面这行会报个warning, 忘了是啥, 直接抑制掉了62                 @$img = file_get_contents($src);  63                 if (!$img)64                 {65                     continue;66                 }67                 file_put_contents($local,$img);68                 //根据数据库的地址下载图片到本地//69                 70                 71                 turnType($local);  72                 //此行代码调用函数, 在文件夹中生成一个同名的webp图片;73                 //接着应该把地址存到数据库中74                 //拼接成你线上的url图片地址,然后存到数据库就行了75                 //但是没必要,名字都是一样的,只是后缀不一样76             }77         }78     }79     echo $flag; 80     $flag = false;    //这行也是不需要的, 但是为了祭奠我的老师, 容许我放在这里占个位/81 } catch (PDOException $e) {82     echo 'SQL Query:'.$sql.'</br>';83     echo 'Connection failed:'.$e->getMessage();  84 }85 ?>
sqlsrc

关于上面这个文件,while中的代码, 主要是正则 拼接地址,这部分可以不看, 每个人的业务都不一样, 所以看了也白看, 直接看其他部分(gd库函数和最后的调用函数)

我这里是1次查50张图片, 然后遍历, 一张图片一张图片生成webp,效率非常不高///////////

pictest.php文件如下,(上个文件中有调用, )

单个图片生成webp

关于PHP批量图片格式转换的问题--本文转成webp, 其他过程格式一样-关于PHP批量图片格式转换的问题--本文转成webp, 其他过程格式一样-
 1 <?php  2 /*  3 ** webp格式转换函数,   4 ** 参数为具体的图片路径加上文件名,  5 ** 例:D:/workspaces/upload/images/2017/demo.jpeg  6 */ 7 function turnType($file) 8 { 9     if(is_file($file))10     {11         //获取文件后缀名12         $ext = pathinfo($file,PATHINFO_EXTENSION);;13         14         //根据后缀名把jpg或者png转成webp15         if($ext == 'jpeg' || $ext == 'jpg' || $ext == 'png')16         {17             //生成新的文件名18             $newpic = rtrim($file,$ext).'webp';19                         20             if($ext == 'jpg' )21             {22                 $ext = 'jpeg';23             }24             25             $funName = 'imagecreatefrom'.$ext;  //拼接函数名imagecreatefromjpeg 还是 imagecreatefrompng26             27             $hImg = $funName($file); //打开这个图片资源,28             29             imagewebp($hImg,$newpic);  //用这个图片资源创建一个webp图片, 存在路径$tdir30             31             imagedestroy($hImg);     //销毁画布资源32         }33     }34 }35 36 ?>
单个文件生成webp

以上三个代码放在一个文件夹中/   主要改第二个文件sqlsrc.php中拼接地址的部分(或者删除)    ,图片直接在本地的...可以参考下面的代码,

怎么限制每次查询的数量没考虑, 谁有建议可以贴上来/

这里还有直接遍历整个目录, 然后批量生成webp格式的代码. 数据量小的可以参考下/;

<?php $dir = '../images';   //这里设置目录, 会遍历整个目录,然后生成一个webp格式的图片/   数量太大会超内存,有需要的可以参考imgtype($dir);//这里调用函数//格式转换函数function jpgturn ($sdir,$tdir,$ext){    if($ext == 'jpeg' || $ext == 'jpg')    {        $hImg = imagecreatefromjpeg($sdir);    }    if($ext == 'png' || $ext == 'PNG')    {        $hImg = imagecreatefrompng($sdir);    }    imagewebp($hImg,$tdir);           imagedestroy($hImg);    }// 自定义函数---获取后缀名;function get_extension($file){    return pathinfo($file,PATHINFO_EXTENSION);}// 遍历目录, 递归调用, 拼接新文件名, 然后调用格式转换函数function imgtype ($dir){    $dir = rtrim($dir,'/').'/';    $hd = opendir($dir);            //        while($hf=readdir($hd))         //    {        if($hf=='.'||$hf=='..')        {            continue;        }    if(is_file($dir.$hf))    {        //获取文件后缀名的自定义函数        $ext = get_extension($dir.$hf);                //根据后缀名把jpg转成webp        if($ext == 'jpeg' || $ext == 'jpg' || $ext == 'png' || $ext == 'PNG')        {            //生成新的文件名            $new = rtrim($dir.$hf,$ext);            $new .= 'webp';            jpgturn($dir.$hf,$new,$ext);        }            }if(is_dir($dir.$hf))//递归调用    {        imgtype($dir.$hf);    }  }}?>

pictest.php文件

以上是云栖社区小编为您精心准备的的内容,在云栖社区的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索问题 , 图片 , 其他 , 转换 , 格式 , 批量 , 过程 , 关于 , ,以便于您获取更多的相关知识。