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入门的学习方法
Jan 02 PHP
php mssql 数据库分页SQL语句
Dec 16 PHP
php 定义404页面的实现代码
Nov 19 PHP
Mysql中分页查询的两个解决方法比较
May 02 PHP
ThinkPHP 3.2 数据分页代码分享
Oct 14 PHP
php实现在限定区域里自动调整字体大小的类实例
Apr 02 PHP
深入解析PHP的Laravel框架中的event事件操作
Mar 21 PHP
thinkphp框架实现数据添加和显示功能
Jun 29 PHP
Ubuntu中支持PHP5与PHP7双版本的简单实现
Aug 19 PHP
PHP预定义超全局数组变量小结
Aug 20 PHP
PHP的mysqli_ssl_set()函数讲解
Jan 23 PHP
PHP封装的分页类与简单用法示例
Feb 25 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
世界第一个无线广播电台 KDKA
2021/03/01 无线电
收音机频率指针指示不准确和灵敏度低问题
2021/03/02 无线电
php判断字符以及字符串的包含方法属性
2008/08/30 PHP
如何解决phpmyadmin导入数据库文件最大限制2048KB
2015/10/09 PHP
php常用图片处理类
2016/03/16 PHP
Laravel模糊查询区分大小写的实例
2019/09/29 PHP
laravel 输出最后执行sql 附:whereIn的使用方法
2019/10/10 PHP
Jquery上传插件 uploadify v3.1使用说明
2012/06/18 Javascript
利用JS实现浏览器的title闪烁
2013/07/08 Javascript
在jquery中的ajax方法怎样通过JSONP进行远程调用
2014/04/04 Javascript
jQuery学习笔记之 Ajax操作篇(二) - 数据传递
2014/06/23 Javascript
jQuery仿360导航页图标拖动排序效果代码分享
2015/08/24 Javascript
jquery实现简易的移动端验证表单
2015/11/08 Javascript
php 修改密码实现代码
2017/05/24 Javascript
手把手搭建安装基于windows的Vue.js运行环境
2017/06/12 Javascript
Angular2使用SVG自定义图表(条形图、折线图)组件示例
2019/05/10 Javascript
React学习之JSX与react事件实例分析
2020/01/06 Javascript
js滚轮事件 js自定义滚动条的实现
2020/01/18 Javascript
uniapp 仿微信的右边下拉选择弹出框的实现代码
2020/07/12 Javascript
[01:22:19]EG vs TNC Supermajor小组赛B组败者组第一轮 BO3 第二场 6.2
2018/06/03 DOTA
Python实现partial改变方法默认参数
2014/08/18 Python
Python 26进制计算实现方法
2015/05/28 Python
python中的json总结
2018/10/11 Python
pyQt5实时刷新界面的示例
2019/06/25 Python
python文档字符串(函数使用说明)使用详解
2019/07/30 Python
python实现人像动漫化的示例代码
2020/05/17 Python
利用python实现后端写网页(flask框架)
2021/02/28 Python
美国网上眼镜供应商:LEOTONY(眼镜、RX太阳镜和太阳镜)
2017/10/31 全球购物
JSF面试题:Jsf中导航的标签是什么
2013/04/20 面试题
OLEDBConnection和SQLConnection有什么区别
2013/05/31 面试题
学期自我鉴定
2013/11/04 职场文书
网络优化专员求职信
2014/05/04 职场文书
青年教师个人总结
2015/02/11 职场文书
幼儿园园长新年寄语
2015/08/17 职场文书
TensorFlow中tf.batch_matmul()的用法
2021/06/02 Python
详解Python中下划线的5种含义
2021/07/15 Python