php批量图片格式转换的问题解决
最近要把项目中的图片全部生成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文件如下
<?php ini_set ('gd.jpeg_ignore_warning', 1); //忽略 set_time_limit(0);//0表示不限时 $dsn='mysql:host=192.168.1.1;dbname=yourdbname'; $user='root'; $password=''; $status=1; //看个人需要了,这个参数 $data = $_POST; try { $sql='select thumbnail_pic,small_pic,big_pic from sdb_goods'; $sql .= " limit {$data['limit']} offset {$data['offset']}"; // 偏移分页查询/ $dbh=new PDO($dsn,$user,$password); $dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); $stmt=$dbh->prepare($sql); $stmt->bindParam(':status',$status); //绑定参数的样例, 喜欢参数绑定的看这里,其他人无视这行 $stmt->execute(); $flag = false; //这里设置一个标识,如果没走while函数, 那么flag依然为false while ($row=$stmt->fetch(PDO::FETCH_ASSOC)) { $flag = true; //只要有查询到的内容, flag就会true $count = $data['count']; $ptn = "/http.*?fs_storage/"; foreach ($row as $k=>$v){ preg_match_all($ptn,$v,$res); if(empty($res[0])) { continue; } foreach ($res as $kk=>&$vv) //这层遍历不需要, 谁可以优化下贴上来. { $vv[0] = rtrim($vv[0],'fs_storage');//图片远程路径 $vv[0] = rtrim($vv[0],'|');//图片远程路径 $ptn01 = "/http.*?\|/"; $src = preg_replace($ptn01,'',$vv[0]); //远程路径标准版 if(empty($src)) { continue; } //这里获取到表中图片的地址, 整理成本地的地址 $ptn02 = "/.*com/"; $local = preg_replace($ptn02,'.',$src); //本地路径 $ptn03 = "/:88/"; $local = preg_replace($ptn03,'',$local); //本地路径+文件名 $path = pathinfo($local,PATHINFO_DIRNAME); if(empty($path)) { continue; } if(!is_dir($path)) { mkdir($path,777,true); // } //下面这行会报个warning, 忘了是啥, 直接抑制掉了 @$img = file_get_contents($src); if (!$img) { continue; } file_put_contents($local,$img); //根据数据库的地址下载图片到本地// turnType($local); //此行代码调用函数, 在文件夹中生成一个同名的webp图片; //接着应该把地址存到数据库中 //拼接成你线上的url图片地址,然后存到数据库就行了 //但是没必要,名字都是一样的,只是后缀不一样 } } } echo $flag; $flag = false; //这行也是不需要的, 但是为了祭奠我的老师, 容许我放在这里占个位/ } catch (PDOException $e) { echo 'SQL Query:'.$sql.'</br>'; echo 'Connection failed:'.$e->getMessage(); } ?> sqlsrc
关于上面这个文件,while中的代码, 主要是正则 拼接地址,这部分可以不看, 每个人的业务都不一样, 所以看了也白看, 直接看其他部分(gd库函数和最后的调用函数)
我这里是1次查50张图片, 然后遍历, 一张图片一张图片生成webp,效率非常不高///////////
pictest.php文件如下,(上个文件中有调用, )
单个图片生成webp
<?php /* ** webp格式转换函数, ** 参数为具体的图片路径加上文件名, ** 例:D:\workspaces\upload\images\2017\demo.jpeg */ function turnType($file) { if(is_file($file)) { //获取文件后缀名 $ext = pathinfo($file,PATHINFO_EXTENSION);; //根据后缀名把jpg或者png转成webp if($ext == 'jpeg' || $ext == 'jpg' || $ext == 'png') { //生成新的文件名 $newpic = rtrim($file,$ext).'webp'; if($ext == 'jpg' ) { $ext = 'jpeg'; } $funName = 'imagecreatefrom'.$ext; //拼接函数名imagecreatefromjpeg 还是 imagecreatefrompng $hImg = $funName($file); //打开这个图片资源, imagewebp($hImg,$newpic); //用这个图片资源创建一个webp图片, 存在路径$tdir imagedestroy($hImg); //销毁画布资源 } } } ?> 单个文件生成webp
单个文件生成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); } } }?>
以上是php批量图片格式转换的问题解决的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

热门话题

PHP 8.4 带来了多项新功能、安全性改进和性能改进,同时弃用和删除了大量功能。 本指南介绍了如何在 Ubuntu、Debian 或其衍生版本上安装 PHP 8.4 或升级到 PHP 8.4

Visual Studio Code,也称为 VS Code,是一个免费的源代码编辑器 - 或集成开发环境 (IDE) - 可用于所有主要操作系统。 VS Code 拥有针对多种编程语言的大量扩展,可以轻松编写

如果您是一位经验丰富的 PHP 开发人员,您可能会感觉您已经在那里并且已经完成了。您已经开发了大量的应用程序,调试了数百万行代码,并调整了一堆脚本来实现操作

本教程演示了如何使用PHP有效地处理XML文档。 XML(可扩展的标记语言)是一种用于人类可读性和机器解析的多功能文本标记语言。它通常用于数据存储

JWT是一种基于JSON的开放标准,用于在各方之间安全地传输信息,主要用于身份验证和信息交换。1.JWT由Header、Payload和Signature三部分组成。2.JWT的工作原理包括生成JWT、验证JWT和解析Payload三个步骤。3.在PHP中使用JWT进行身份验证时,可以生成和验证JWT,并在高级用法中包含用户角色和权限信息。4.常见错误包括签名验证失败、令牌过期和Payload过大,调试技巧包括使用调试工具和日志记录。5.性能优化和最佳实践包括使用合适的签名算法、合理设置有效期、

字符串是由字符组成的序列,包括字母、数字和符号。本教程将学习如何使用不同的方法在PHP中计算给定字符串中元音的数量。英语中的元音是a、e、i、o、u,它们可以是大写或小写。 什么是元音? 元音是代表特定语音的字母字符。英语中共有五个元音,包括大写和小写: a, e, i, o, u 示例 1 输入:字符串 = "Tutorialspoint" 输出:6 解释 字符串 "Tutorialspoint" 中的元音是 u、o、i、a、o、i。总共有 6 个元

静态绑定(static::)在PHP中实现晚期静态绑定(LSB),允许在静态上下文中引用调用类而非定义类。1)解析过程在运行时进行,2)在继承关系中向上查找调用类,3)可能带来性能开销。

PHP的魔法方法有哪些?PHP的魔法方法包括:1.\_\_construct,用于初始化对象;2.\_\_destruct,用于清理资源;3.\_\_call,处理不存在的方法调用;4.\_\_get,实现动态属性访问;5.\_\_set,实现动态属性设置。这些方法在特定情况下自动调用,提升代码的灵活性和效率。
