PHP高效获取远程图片尺寸和大小的实现方法


Posted in PHP onOctober 20, 2017

 PHP高效获取远程图片尺寸和大小的实现方法

在这里分享一下自己的心得,希望和大家一起分享技术,如果有什么不足,还请大家指正。写出这篇目的,就是希望大家一起成长,我也相信技术之间没有高低,只有互补,只有分享,才能使彼此更加成长。  

实现代码:

/** 
 * 获取远程图片的宽高和体积大小 
 * 
 * @param string $url 远程图片的链接 
 * @param string $type 获取远程图片资源的方式, 默认为 curl 可选 fread 
 * @param boolean $isGetFilesize 是否获取远程图片的体积大小, 默认false不获取, 设置为 true 时 $type 将强制为 fread 
 * @return false|array 
 */ 
function myGetImageSize($url, $type = 'curl', $isGetFilesize = false)  
{ 
  // 若需要获取图片体积大小则默认使用 fread 方式 
  $type = $isGetFilesize ? 'fread' : $type; 
  
   if ($type == 'fread') { 
    // 或者使用 socket 二进制方式读取, 需要获取图片体积大小最好使用此方法 
    $handle = fopen($url, 'rb'); 
  
    if (! $handle) return false; 
  
    // 只取头部固定长度168字节数据 
    $dataBlock = fread($handle, 168); 
  } 
  else { 
    // 据说 CURL 能缓存DNS 效率比 socket 高 
    $ch = curl_init($url); 
    // 超时设置 
    curl_setopt($ch, CURLOPT_TIMEOUT, 5); 
    // 取前面 168 个字符 通过四张测试图读取宽高结果都没有问题,若获取不到数据可适当加大数值 
    curl_setopt($ch, CURLOPT_RANGE, '0-167'); 
    // 跟踪301跳转 
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); 
    // 返回结果 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
  
    $dataBlock = curl_exec($ch); 
  
    curl_close($ch); 
  
    if (! $dataBlock) return false; 
  } 
  
  // 将读取的图片信息转化为图片路径并获取图片信息,经测试,这里的转化设置 jpeg 对获取png,gif的信息没有影响,无须分别设置 
  // 有些图片虽然可以在浏览器查看但实际已被损坏可能无法解析信息  
  $size = getimagesize('data://image/jpeg;base64,'. base64_encode($dataBlock)); 
  if (empty($size)) { 
    return false; 
  } 
  
  $result['width'] = $size[0]; 
  $result['height'] = $size[1]; 
  
  // 是否获取图片体积大小 
  if ($isGetFilesize) { 
    // 获取文件数据流信息 
    $meta = stream_get_meta_data($handle); 
    // nginx 的信息保存在 headers 里,apache 则直接在 wrapper_data  
    $dataInfo = isset($meta['wrapper_data']['headers']) ? $meta['wrapper_data']['headers'] : $meta['wrapper_data']; 
  
    foreach ($dataInfo as $va) { 
      if ( preg_match('/length/iU', $va)) { 
        $ts = explode(':', $va); 
        $result['size'] = trim(array_pop($ts)); 
        break; 
      } 
    } 
  } 
  
  if ($type == 'fread') fclose($handle); 
  
  return $result; 
} 
  
// 测试的图片链接 
echo '<pre>'; 
$result = myGetImageSize('http://s6.mogujie.cn/b7/bao/120630/2kpa6_kqywusdel5bfqrlwgfjeg5sckzsew_345x483.jpg_225x999.jpg', 'curl'); 
print_r($result); 
echo '<hr />'; 
$result = myGetImageSize('http://s5.mogujie.cn/b7/bao/120629/6d3or_kqytasdel5bgevsugfjeg5sckzsew_801x1193.jpg', 'fread'); 
print_r($result); 
echo '<hr />'; 
$result = myGetImageSize('http://hiphotos.baidu.com/zhengmingjiang/pic/item/1c5f338c6d22d797503d92f9.jpg', 'fread', true); 
print_r($result); 
echo '<hr />'; 
$result = myGetImageSize('http://www.vegandocumentary.com/wp-content/uploads/2009/01/imveganlogotransparentbackground.png', 'curl', true); 
print_r($result); 
echo '<hr />'; 
$result = myGetImageSize('http://jiaoyou.ai9475.com/front/templates/jiaoyou/styles/default/image/ad_pic_1.gif', 'fread'); 
print_r($result);

如有疑问请留言或到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

PHP 相关文章推荐
用php过滤危险html代码的函数
Jul 22 PHP
Function eregi is deprecated (解决方法)
Jun 21 PHP
php将文本文件转换csv输出的方法
Dec 31 PHP
在php中设置session用memcache来存储的方法总结
Jan 14 PHP
Zend Framework实现Zend_View集成Smarty模板系统的方法
Mar 05 PHP
PHP使用PDO操作数据库的乱码问题解决方法
Apr 08 PHP
浅析Yii2集成富文本编辑器redactor实例教程
Apr 25 PHP
PHP 根据key 给二维数组分组
Dec 09 PHP
php获取文件名称和扩展名的方法
Feb 07 PHP
php基于 swoole 实现的异步处理任务功能示例
Aug 13 PHP
PHP 进程池与轮询调度算法实现多任务的示例代码
Nov 26 PHP
PHP pthreads v3下worker和pool的使用方法示例
Feb 21 PHP
PHP静态延迟绑定和普通静态效率的对比
Oct 20 #PHP
php+ajax实现仿百度查询下拉内容功能示例
Oct 20 #PHP
详解cookie验证的php应用的一种SSO解决办法
Oct 20 #PHP
thinkPHP5项目中实现QQ第三方登录功能
Oct 20 #PHP
PHP简单实现二维数组赋值与遍历功能示例
Oct 19 #PHP
phpStudy2016 配置多个域名期间遇到的问题小结
Oct 19 #PHP
phpStudy配置多站点多域名方法及遇到的403错误解决方法
Oct 19 #PHP
You might like
php单件模式结合命令链模式使用说明
2008/09/07 PHP
php中filter函数验证、过滤用户输入的数据
2014/01/13 PHP
php实现的单一入口应用程序实例分析
2015/09/23 PHP
PHP 实现的将图片转换为TXT
2015/10/21 PHP
Symfony学习十分钟入门经典教程
2016/02/03 PHP
php实现的一段简单概率相关代码
2016/05/30 PHP
Redis使用Eval多个键值自增的操作实例
2016/11/04 PHP
tbody元素支持嵌套的注意方法
2007/03/24 Javascript
JavaScript 对象模型 执行模型
2009/12/06 Javascript
js getElementsByTagName的简写方式
2010/06/27 Javascript
Javascript之this关键字深入解析
2013/11/12 Javascript
js实现兼容性好的微软官网导航下拉菜单效果
2015/09/07 Javascript
基于jquery实现智能提示控件intellSeach.js
2016/03/17 Javascript
微信小程序 使用腾讯地图SDK详解及实现步骤
2017/02/28 Javascript
原生JS+CSS实现炫酷重力模拟弹跳系统的登录页面
2017/11/01 Javascript
vue.js 实现图片本地预览 裁剪 压缩 上传功能
2018/03/01 Javascript
浅析js中mvvm模式实现的原理
2018/10/06 Javascript
vue 双向数据绑定的实现学习之监听器的实现方法
2018/11/30 Javascript
JavaScript创建对象方式总结【工厂模式、构造函数模式、原型模式等】
2018/12/19 Javascript
vue实现tab栏点击高亮效果
2020/08/19 Javascript
原生JavaScript实现刮刮乐
2020/09/29 Javascript
javascript全局自定义鼠标右键菜单
2020/12/08 Javascript
用smtplib和email封装python发送邮件模块类分享
2014/02/17 Python
解决python3 urllib中urlopen报错的问题
2017/03/25 Python
Python实现Kmeans聚类算法
2020/06/10 Python
安装python及pycharm的教程图解
2019/10/10 Python
如何在Windows中安装多个python解释器
2020/06/16 Python
python爬虫使用requests发送post请求示例详解
2020/08/05 Python
深入CSS3 动画效果的总结详解
2013/05/09 HTML / CSS
Why we need EJB
2016/10/20 面试题
创意婚礼策划方案
2014/05/18 职场文书
班级文化建设标语
2014/06/23 职场文书
小学生美德少年事迹材料
2014/08/24 职场文书
校长创先争优承诺书
2014/08/30 职场文书
2015年酒店前台工作总结
2015/04/20 职场文书
CSS3 制作的彩虹按钮样式
2021/04/11 HTML / CSS