关于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文件如下
<?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
以上三个代码放在一个文件夹中/ 主要改第二个文件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文件
关于PHP批量图片格式转换的问题--本文转成webp, 其他过程格式一样的更多相关文章
- js时间格式转换,传入时间戳,第二哥参数是格式,也可不传
export function parseTime(time, pattern) { if (arguments.length === 0 || !time) { return null } cons ...
- GDI+ gif文件的显示和格式转换
GDI+ gif文件的显示和格式转换 gdi+imagedeletenulltiff GDI+ gif文件的显示和格式转换 怎么获取gif文件的每一帧,并且显示出来呢? 1.怎么用gid+显示gi ...
- Unity 利用FFmpeg实现录屏、直播推流、音频视频格式转换、剪裁等功能
目录 一.FFmpeg简介. 二.FFmpeg常用参数及命令. 三.FFmpeg在Unity 3D中的使用. 1.FFmpeg 录屏. 2.FFmpeg 推流. 3.FFmpeg 其他功能简述. 一. ...
- winform利用itextsharp.dll实现图片文件转换PDF格式文件
1.利用itextsharp.dll实现单个图片文件转换为PDF格式文件, 可以使用以下类: void ConvertJPG2PDF(string jpgfile, string pdf) { var ...
- 批量将网页转换成图片或PDF文档技巧分享
工作中我们有时要将一些批量的网页转换成图片或者PDF文档格式,尽管多数浏览器具有滚动截屏或者打印输出PDF文档功能.可是假设有几十上百张网页须要处理,那也是要人命的.所以我一直想找一款可以批量处理该工 ...
- 【VC++技术杂谈007】使用GDI+进行图片格式转换
本文主要介绍如何使用GDI+对图片进行格式转换,可以转换的图片格式为bmp.jpg.png. 1.加载GDI+库 GDI+是GDI图形库的一个增强版本,提供了一系列Visual C++ API.为了使 ...
- oracle 报“无效数字”异常和“ORA-01830: 日期格式图片在转换整个输入字符串之前结束”
1.问题1 执行下列SQL: sql = "select count(1) as totle from vhl_model_data a where a.OBTAIN_CREATE_TIME ...
- python 将png图片格式转换生成gif动画
先看知乎上面的一个连接 用Python写过哪些[脑洞大开]的小工具? https://www.zhihu.com/question/33646570/answer/157806339 这个哥们通过爬气 ...
- jpg、png格式的图片转换成webp后颜色失真的问题
今天简单的试用了一下 cweb.exe 将 jpg, png 格式的图片转换成 webp 格式. 我今天下载的是当前最新版:1.0.0 cwebp 3.jpg -q 85 -o 3.webp 发现图 ...
随机推荐
- 使用selenium时,使用从系统启动浏览器与通过自动化驱动方式启动浏览器控件ID不一样解决方法
最近遇到一个怪事,通过正常打开浏览器,按照正常的web登录然后点击进入系统流程,将各控件的ID识别成功,然后使用 python3+selenium写好脚本,高高兴兴的用脚本跑时老是提示找不到控件,然后 ...
- Go搭建后台服务学习记录
资料: 1. go基础 https://juejin.im/entry/58329f84da2f600063074382 https://www.w3cschool.cn/go/ 2.go的一个orm ...
- 分布式消息中间件rocketmq的原理与实践
RocketMQ作为阿里开源的一款高性能.高吞吐量的消息中间件,它是怎样来解决这两个问题的?RocketMQ 有哪些关键特性?其实现原理是怎样的? 关键特性以及其实现原理 一.顺序消息 消息有序指的是 ...
- mumu安卓模拟器使用教程
安装教程: 1http://mumu.163.com/ 在这网址里面下载 2.安装 我的是mac 安装时需要输入你的你电脑密码 但是也报错,你点击旁边的提示就会告诉去安全与隐私里点击允许就好了 很 ...
- pom文件miss artifact com.sun:tools:jar:1.5.0:system问题
问题现象: 导入新的maven项目时,有时候pom.xml文件会提示一个错误信息:Missing artifact com.sun:tools:jar:1.5.0:system 问题原因: maven ...
- 为了下载和使用最新的git,只好安装了迅雷
一 安装迅雷时总感觉它的图标像是灰鸽子,让人不放心. 从https://git-scm.com/downloads上找到64-bit Git for Windows Setup的地址: https: ...
- UVA140-Bandwidth(搜索剪枝)
Problem UVA140-Bandwidth Time Limit: 3000 mSec Problem Description Given a graph (V, E) where V is ...
- 11g SPA (sql Performance Analyze) 进行升级测试
注;转自http://ju.outofmemory.cn/entry/77139 11G的新特性SPA(SQL Performance Analyze)现在被广泛的应用到升级和迁移的场景.当然还有一些 ...
- 【转】Chrome 控制台新玩法-console显示图片以及为文字加样式
在正常模式下,一般只能向console 控制台输出简单的文字信息.但为了把信息输出得更优雅更便于阅读,除了cosole.log()方法外还可以调用 cosole.warn() 来输出警告信息,在控制台 ...
- linux注释多行
方法一:使用可视化模块添加实现多行注释 1.打开文件/etc/password进行测试: vim /etc/password 2.进入到视图模式:按ctrl+v 1 root:x:0:0:root:/ ...