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的access操作类
Apr 09 PHP
攻克CakePHP系列三 表单数据增删改
Oct 22 PHP
PHP 开源AJAX框架14种
Aug 24 PHP
PHP 用数组降低程序的时间复杂度
Dec 04 PHP
PHP中防止SQL注入攻击和XSS攻击的两个简单方法
Apr 15 PHP
理解和运用PHP中的多态性[译]
Aug 02 PHP
PHP判断搜索引擎蜘蛛并自动记忆到文件的代码
Feb 04 PHP
PHP使用Session遇到的一个Permission denied Notice解决办法
Jul 30 PHP
php数组索引的Key加引号和不加引号的区别
Aug 19 PHP
php json转换成数组形式代码分享
Nov 10 PHP
PHP简单实现解析xml为数组的方法
May 02 PHP
php使用mysqli和pdo扩展,测试对比连接mysql数据库的效率完整示例
May 09 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
可快速识别放射性物质-国外大神教你diy一个开放式辐射探测器
2020/03/12 无线电
自动生成文章摘要的代码[PHP 版本]
2007/03/20 PHP
php错误日志简单配置方法
2016/07/11 PHP
Discuz论坛密码与密保加密规则
2016/12/19 PHP
ajax+php实现无刷新验证手机号的实例
2017/12/22 PHP
求解开jscript.encode代码的asp函数
2007/02/28 Javascript
一个可拖拽列宽表格实例演示
2012/11/26 Javascript
Web Inspector:关于在 Sublime Text 中调试Js的介绍
2013/04/18 Javascript
jquery中focus()函数实现当对象获得焦点后自动把光标移到内容最后
2013/09/29 Javascript
下拉列表select 由左边框移动到右边示例
2013/12/04 Javascript
js写出遮罩层登陆框和对联广告并自动跟随滚动条滚动
2014/04/29 Javascript
深入理解requestAnimationFrame的动画循环
2016/09/20 Javascript
深入理解jquery中extend的实现
2016/12/22 Javascript
js实现文字向上轮播功能
2017/01/13 Javascript
Vue子组件向父组件通信与父组件调用子组件中的方法
2018/06/22 Javascript
Vue点击切换颜色的方法
2018/09/13 Javascript
Vue中插入HTML代码的方法
2018/09/21 Javascript
Openlayers实现点闪烁扩散效果
2020/09/24 Javascript
python的else子句使用指南
2016/02/27 Python
详解Python import方法引入模块的实例
2017/08/02 Python
Python3网络爬虫之使用User Agent和代理IP隐藏身份
2017/11/23 Python
Python使用matplotlib绘制正弦和余弦曲线的方法示例
2018/01/06 Python
Python中optparser库用法实例详解
2018/01/26 Python
python将每个单词按空格分开并保存到文件中
2018/03/19 Python
Python使用numpy模块实现矩阵和列表的连接操作方法
2019/06/26 Python
python模拟斗地主发牌
2020/04/22 Python
如何在Anaconda中打开python自带idle
2020/09/21 Python
构造方法和其他方法的区别?怎么调用父类的构造方法
2013/09/22 面试题
我想声明一个指针并为它分配一些空间, 但却不行。这些代码有什么 问题?char *p; *p = malloc(10);
2016/10/06 面试题
好矿嫂事迹材料
2014/01/21 职场文书
实习老师离校感言
2014/02/03 职场文书
企业宣传标语
2014/06/09 职场文书
公司股东出资证明书
2014/11/01 职场文书
详解MySQL主从复制及读写分离
2021/05/07 MySQL
Pyhton模块和包相关知识总结
2021/05/12 Python
海弦WR-800F
2022/04/05 无线电