php中使用gd库实现下载网页中所有图片


Posted in PHP onMay 12, 2015

在前期的php教程就讲了php gd库可以实现远程图片的下载,但是那只是下载了一张图片,原理是一样的,要想下载一个网页的所有图片只要使用正则表达式进行判断,找出所有的图片url就可以进行循环下载了,我特地参照网络资源编写了gd库图片下载类!
php代码如下:

<?php
header("Content-type:text/html ; charset=utf-8");
if (!empty($_POST['submit'])){
 $url = $_POST['url'];
 //为了获取相对路径的图片所做的操作
 $url_fields = parse_url($url);
 $main_url = $url_fields['host'];
 $base_url = substr($url,0,strrpos($url, '/')+1);
 //获取网页内容
 //设置代理服务器
 $opts = array('http'=>array('request_fulluri'=>true));
 $context = stream_context_create($opts);
 $content = file_get_contents($url,false,$context);
 //匹配img标签,将所有匹配字符串保存到数组$matches
 $reg = "/<img.*?src=\"(.*?)\".*?>/i";
 preg_match_all($reg, $content, $matches);
 $count = count($matches[0]);
 for ($i=0; $i<$count; $i++){
 /*将所有图片的url转换为小写
  *$matches[1][$i] = strtolower($matches[1][$i]);
 */
 //如果图片为相对路径就转化为全路径
 if (!strpos('a'.$matches[1][$i], 'http')){
  //因为'/'是第0个位置
  if (strpos('a'.$matches[1][$i], '/')){
  $matches[1][$i] = 'http://'.$main_url.$matches[1][$i];
  }else{
  $matches[1][$i] = $base_url.$matches[1][$i];
  }
 }
 }
 //过滤重复的图片
 $img_arr = array_unique($matches[1]);
 //实例化图片下载类
 $getImg = new DownImage();
 $url_count = count($img_arr);
 for ($i=0; $i<$url_count; $i++){
 $getImg->source = $img_arr[$i];
 $getImg->save_address = './pic/';
 $file = $getImg->download();
 }
 echo "下载完成!哈哈,简单吧!";
}
class DownImage{
 public $source;//远程图片URL
 public $save_address;//保存本地地址
 public $set_extension; //设置图片扩展名
 public $quality; //图片的质量(0~100,100最佳,默认75左右)
 //下载方法(选用GD库图片下载)
 public function download(){
 //获取远程图片信息
 $info = @getimagesize($this->source);
 //获取图片扩展名
 $mime = $info['mime'];
 $type = substr(strrchr($mime, '/'), 1);
 //不同的图片类型选择不同的图片生成和保存函数
 switch($type){
  case 'jpeg':
  $img_create_func = 'imagecreatefromjpeg';
  $img_save_func = 'imagejpeg';
  $new_img_ext = 'jpg';
  $image_quality = isset($this->quality) ? $this->quality : 100;
  break;
  case 'png':
  $img_create_func = 'imagecreatefrompng';
  $img_save_func = 'imagepng';
  $new_img_ext = 'png';
  break;
  case 'bmp':
  $img_create_func = 'imagecreatefrombmp';
  $img_save_func = 'imagebmp';
  $new_img_ext = 'bmp';
  break;
  case 'gif':
  $img_create_func = 'imagecreatefromgif';
  $img_save_func = 'imagegif';
  $new_img_ext = 'gif';
  break;
  case 'vnd.wap.wbmp':
  $img_create_func = 'imagecreatefromwbmp';
  $img_save_func = 'imagewbmp';
  $new_img_ext = 'bmp';
  break;
  case 'xbm':
  $img_create_func = 'imagecreatefromxbm';
  $img_save_func = 'imagexbm';
  $new_img_ext = 'xbm';
  break;
  default:
  $img_create_func = 'imagecreatefromjpeg';
  $img_save_func = 'imagejpeg';
  $new_img_ext = 'jpg';
 }
 //根据是否设置扩展名来合成本地文件名
 if (isset($this->set_extension)){
  $ext = strrchr($this->source,".");
  $strlen = strlen($ext);
  $newname = basename(substr($this->source,0,-$strlen)).'.'.$new_img_ext;
 }else{
  $newname = basename($this->source);
 }
 
 //生成本地文件路径
 $save_address = $this->save_address.$newname;
 $img = @$img_create_func($this->source);
 if (isset($image_quality)){
  $save_img = @$img_save_func($img,$save_address,$image_quality);
 }else{
  $save_img = @$img_save_func($img,$save_address);
 }
 return $save_img; 
 }
}
?>
<form method="POST" action="">
远程url地址:<input type="text" name="url" size=30 />
<input type="submit" name="submit" value="下载该页面所有图片" />
</form>

运行结果如图:

php中使用gd库实现下载网页中所有图片

PHP 相关文章推荐
PHP乱码问题,UTF-8乱码常见问题小结
Apr 09 PHP
PHP正确解析UTF-8字符串技巧应用
Nov 07 PHP
php获取textarea的值并处理回车换行的方法
Oct 20 PHP
PHP 7的一些引人注目的新特性简单介绍
Nov 08 PHP
分享PHP源码批量抓取远程网页图片并保存到本地的实现方法
Dec 01 PHP
详解PHP实现执行定时任务
Dec 21 PHP
WordPress开发中用于标题显示的相关函数使用解析
Jan 07 PHP
php正则去除网页中所有的html,js,css,注释的实现方法
Nov 03 PHP
PHP的微信支付接口使用方法讲解
Mar 08 PHP
启用OPCache提高PHP程序性能的方法
Mar 21 PHP
通过PHP的Wrapper无缝迁移原有项目到新服务的实现方法
Apr 02 PHP
详解PHP中curl_multi并发的实现
Jun 08 PHP
php中使用gd库实现远程图片下载实例
May 12 #PHP
PHP输入输出流学习笔记
May 12 #PHP
PHP SPL标准库之SplFixedArray使用实例
May 12 #PHP
php中get_defined_constants函数用法实例分析
May 12 #PHP
PHP SPL标准库之数据结构栈(SplStack)介绍
May 12 #PHP
php遍历类中包含的所有元素的方法
May 12 #PHP
PHP 双链表(SplDoublyLinkedList)简介和使用实例
May 12 #PHP
You might like
PHP中的cookie
2006/11/26 PHP
浅析THINKPHP的addAll支持的最大数据量
2015/02/03 PHP
PHP数据库连接mysql与mysqli对比分析
2016/01/04 PHP
PHP 计算两个特别大的整数实例代码
2018/05/07 PHP
google jQuery 引用文件,jQuery 引用地址集合(jquery 1.2.6至jquery1.5.2)
2011/04/24 Javascript
基于jquery的loading 加载提示效果实现代码
2011/09/01 Javascript
Jquery的hover方法让鼠标经过li时背景变色
2013/09/06 Javascript
javascript eval(func())使用示例
2013/12/05 Javascript
jquery中的on方法使用介绍
2013/12/29 Javascript
jquery实现简单的无缝滚动
2015/04/15 Javascript
jquery使用each方法遍历json格式数据实例
2015/05/18 Javascript
JavaScript的Polymer框架中dom-repeat与VM的相关操作
2015/07/29 Javascript
轻松学习jQuery插件EasyUI EasyUI创建树形菜单
2015/11/30 Javascript
JavaScript Split()方法
2015/12/18 Javascript
javascript之IE版本检测超简单方法
2016/08/20 Javascript
AngularJS深入探讨scope,继承结构,事件系统和生命周期
2016/11/02 Javascript
微信小程序 loading 详解及实例代码
2016/11/09 Javascript
bootstrap fileinput 插件使用项目总结(经验)
2017/02/22 Javascript
JavaScript实现form表单的多文件上传
2020/03/27 Javascript
VUE中v-model和v-for指令详解
2017/06/23 Javascript
解决element-ui中下拉菜单子选项click事件不触发的问题
2018/08/22 Javascript
ES7之Async/await的使用详解
2019/03/28 Javascript
JS实现点击生成UUID的方法完整实例【基于jQuery】
2019/06/12 jQuery
layui的布局和表格的渲染以及动态生成表格的方法
2019/09/18 Javascript
js获取本日、本周、本月的时间代码
2020/02/01 Javascript
pycham查看程序执行的时间方法
2018/11/29 Python
解析pip安装第三方库但PyCharm中却无法识别的问题及PyCharm安装第三方库的方法教程
2020/03/10 Python
女性时尚在线:IVRose
2019/02/23 全球购物
Zatchels官网:英国剑桥包品牌
2021/01/12 全球购物
年终考核评语
2014/01/19 职场文书
活动策划邀请函
2014/02/06 职场文书
学习雷锋演讲稿
2014/05/10 职场文书
党员三严三实对照检查材料
2014/10/13 职场文书
2014年作风建设工作总结
2014/10/29 职场文书
2016高考冲刺决心书
2015/09/23 职场文书
sqlserver2017共享功能目录路径不可改的解决方法
2021/04/16 SQL Server