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实现Ftp用户的在线管理的代码
Mar 06 PHP
PHP实现多条件查询实例代码
Jul 17 PHP
php中日期加减法运算实现代码
Dec 08 PHP
PHP中3种生成XML文件方法的速度效率比较
Oct 06 PHP
PHP不用第三变量交换2个变量的值的解决方法
Jun 02 PHP
php实现字符串首字母转换成大写的方法
Mar 17 PHP
PHP 微信支付类 demo
Nov 30 PHP
PHP验证码生成原理和实现
Jan 24 PHP
twig里使用js变量的方法
Feb 05 PHP
php pdo oracle中文乱码的快速解决方法
May 16 PHP
老生常谈PHP面向对象之标识映射
Jun 21 PHP
详解PHP PDO简单教程
May 28 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 文章采集正则代码
2009/12/28 PHP
Discuz Uchome ajaxpost小技巧
2011/01/04 PHP
PHP根据IP判断地区名信息的示例代码
2014/03/03 PHP
PHP使用Alexa API获取网站的Alexa排名例子
2014/06/12 PHP
php 多进程编程父进程的阻塞与非阻塞实例分析
2020/02/22 PHP
javascript+iframe 实现无刷新载入整页的代码
2010/03/17 Javascript
jQuery下通过replace字符串替换实现大小图片切换
2012/05/22 Javascript
JavaScript的null和undefined区别示例介绍
2014/09/15 Javascript
如何解决easyui自定义标签 datagrid edit combobox 手动输入保存不上
2015/12/26 Javascript
jQuery  ready方法实现原理详解
2016/10/19 Javascript
windows下vue.js开发环境搭建教程
2017/03/20 Javascript
vue利用better-scroll实现轮播图与页面滚动详解
2017/10/20 Javascript
js+html5实现手机九宫格密码解锁功能
2018/07/30 Javascript
JavaScript定时器设置、使用与倒计时案例详解
2019/07/08 Javascript
JavaScript如何借用构造函数继承
2019/11/06 Javascript
Node配合WebSocket做多文件下载以及进度回传
2019/11/07 Javascript
python+Django+apache的配置方法详解
2016/06/01 Python
简单了解python代码优化小技巧
2019/07/08 Python
使用coverage统计python web项目代码覆盖率的方法详解
2019/08/05 Python
python——全排列数的生成方式
2020/02/26 Python
使用keras框架cnn+ctc_loss识别不定长字符图片操作
2020/06/29 Python
jupyter notebook 写代码自动补全的实现
2020/11/02 Python
3D动画《斗罗大陆》上线当日播放过亿
2021/03/16 国漫
CSS3制作炫酷带方向感应的鼠标滑过图片3D动画
2016/03/16 HTML / CSS
localStorage、sessionStorage使用总结
2017/11/17 HTML / CSS
Manuka Doctor美国官网:麦卢卡蜂蜜和蜂毒护肤
2016/12/25 全球购物
全国道德模范事迹
2014/02/01 职场文书
丑小鸭教学反思
2014/02/03 职场文书
环保项目建议书
2014/08/26 职场文书
教师竞聘上岗演讲稿
2014/09/03 职场文书
党员个人自我剖析材料
2014/10/08 职场文书
导游词之岳阳楼
2019/09/25 职场文书
导游词之丹东鸭绿江
2019/10/24 职场文书
Python使用sql语句对mysql数据库多条件模糊查询的思路详解
2021/04/12 Python
React Fragment介绍与使用详解
2021/11/11 Javascript
Oracle表空间与权限的深入讲解
2021/11/17 Oracle