zoukankan      html  css  js  c++  java
  • 关于PHP批量图片格式转换的问题--本文转成webp, 其他过程格式一样

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

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

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

    ------------------------------------------------------------------------

    本文是利用ajax递归调用的方式循环调用php文件,

    另附一篇用队列而不是递归的批量处理文件的方法,

    http://www.cnblogs.com/lz0925/p/7716628.html

    ------------------------------------------------------------------------

    <!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文件如下

     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依然为false
    21     while ($row=$stmt->fetch(PDO::FETCH_ASSOC)) {
    22         $flag = true;  //只要有查询到的内容, flag就会true
    23         $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

     1 <?php 
     2 /* 
     3 ** webp格式转换函数,  
     4 ** 参数为具体的图片路径加上文件名, 
     5 ** 例:D:workspacesuploadimages2017demo.jpeg 
     6 */
     7 function turnType($file)
     8 {
     9     if(is_file($file))
    10     {
    11         //获取文件后缀名
    12         $ext = pathinfo($file,PATHINFO_EXTENSION);;
    13         
    14         //根据后缀名把jpg或者png转成webp
    15         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 还是 imagecreatefrompng
    26             
    27             $hImg = $funName($file); //打开这个图片资源,
    28             
    29             imagewebp($hImg,$newpic);  //用这个图片资源创建一个webp图片, 存在路径$tdir
    30             
    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文件

  • 相关阅读:
    Python学习笔记21:数据库操作(sqlite3)
    JAVA的extends使用方法
    thinkphp5的Illegal string offset 'id'错误
    thinkphp5项目--个人博客(五)
    语法错误: unexpected ''); ?></span></span></h2> ' (T_CONSTANT_ENCAPSED_STRING), expecting ',' or ';'
    thinkphp5.0的验证码安装和相关错误
    thinkphp5项目--个人博客(四)
    thinkphp5项目--个人博客(三)
    NAS是什么
    百度编辑器简介及如何使用
  • 原文地址:https://www.cnblogs.com/lz0925/p/7687212.html
Copyright © 2011-2022 走看看