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正则
Jul 07 PHP
php+mysql开源XNA 聚合程序发布 下载
Jul 13 PHP
深入php常用函数的使用汇总
Jun 08 PHP
PHP JSON出错:Cannot use object of type stdClass as array解决方法
Aug 16 PHP
PHP数据库连接mysql与mysqli对比分析
Jan 04 PHP
php打包网站并在线压缩为zip
Feb 13 PHP
PHP不使用递归的无限级分类简单实例
Nov 05 PHP
Laravel接收前端ajax传来的数据的实例代码
Jul 20 PHP
PHP设计模式之原型设计模式原理与用法分析
Apr 25 PHP
PHP中number_format()函数的用法讲解
Apr 08 PHP
php伪静态验证码不显示的解决方案
Sep 26 PHP
基于PHP实现解密或加密Cloudflar邮箱保护
Jun 24 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
MYSQL环境变量设置方法
2007/01/15 PHP
一篇入门的php Class 文章
2007/04/04 PHP
PHP 导出数据到淘宝助手CSV的方法分享
2010/02/27 PHP
php eval函数用法 PHP中eval()函数小技巧
2012/10/31 PHP
mapper--图片热点区域高亮组件官方站点
2007/12/22 Javascript
js关于精确计算和数值格式化以及直接引js文件
2014/01/28 Javascript
浅谈Node.js中的定时器
2015/06/18 Javascript
学习javascript面向对象 javascript实现继承的方式
2016/01/04 Javascript
Javascript 实现放大镜效果实例详解
2016/12/03 Javascript
Bootstrap基本样式学习笔记之表格(2)
2016/12/07 Javascript
微信小程序 自定义对话框实例详解
2017/01/20 Javascript
d3.js中冷门却实用的内置函数总结
2017/02/04 Javascript
JS闭包用法实例分析
2017/03/27 Javascript
bootstrap表单示例代码分享
2017/05/18 Javascript
JavaScript箭头(arrow)函数详解
2017/06/04 Javascript
JavaScript生成简单等差数列
2017/11/28 Javascript
vue+element-ui+ajax实现一个表格的实例
2018/03/09 Javascript
vue form check 表单验证的实现代码
2018/12/09 Javascript
Layui之table中的radio在切换分页时无法记住选中状态的解决方法
2019/09/02 Javascript
微信小程序 接入腾讯地图的两种写法
2021/01/12 Javascript
小结Python用fork来创建子进程注意事项
2014/07/03 Python
python迭代器实例简析
2014/09/25 Python
使用Python的Tornado框架实现一个简单的WebQQ机器人
2015/04/24 Python
Python 3 使用Pillow生成漂亮的分形树图片
2019/12/24 Python
tensorflow 获取checkpoint中的变量列表实例
2020/02/11 Python
详解用python -m http.server搭一个简易的本地局域网
2020/09/24 Python
CSS3 border-image详解、应用及jQuery插件
2011/08/29 HTML / CSS
CSS3感应鼠标的背景闪烁和图片缩放动画效果
2014/05/14 HTML / CSS
HTML5 标准将把互联网视频扔回到黑暗时代
2010/02/10 HTML / CSS
台湾最大网路书店:博客来
2018/03/18 全球购物
《两只鸟蛋》教学反思
2014/02/10 职场文书
关于环保的标语
2014/06/13 职场文书
2016年暑假家长对孩子评语
2015/12/01 职场文书
大学生社区义工服务心得体会
2016/01/22 职场文书
2016年幼儿园教研活动总结
2016/04/05 职场文书
TS 类型兼容教程示例详解
2022/09/23 Javascript