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者的疑难问答(1)
Oct 09 PHP
php xml留言板 xml存储数据的简单例子
Aug 24 PHP
解析左右值无限分类的实现算法
Jun 20 PHP
PHP微框架Dispatch简介
Jun 12 PHP
PHP 验证登陆类分享
Mar 13 PHP
分享php代码将360浏览器导出的favdb的sqlite数据库文件转换为html
Dec 09 PHP
ThinkPHP自定义Redis处理SESSION的实现方法
May 16 PHP
在PHP语言中使用JSON和将json还原成数组的方法
Jul 19 PHP
PHP中大括号'{}'用法实例总结
Feb 08 PHP
cakephp2.X多表联合查询join及使用分页查询的方法
Feb 23 PHP
php函数式编程简单示例
Aug 08 PHP
PhpSpreadsheet设置单元格常用操作汇总
Nov 13 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生成图形(Libchart)实例
2013/11/06 PHP
PHP实现通过get方式识别用户发送邮件的方法
2015/07/16 PHP
PHP模拟post提交数据方法汇总
2016/02/16 PHP
php中类和对象:静态属性、静态方法
2017/04/09 PHP
PHP7多线程搭建教程
2017/04/21 PHP
laravel 数据验证规则详解
2019/10/23 PHP
使用Entrust扩展包在laravel 中实现RBAC的功能
2020/03/16 PHP
JavaScript 验证浏览器是否支持javascript的方法小结
2009/05/17 Javascript
Jquery中使用setInterval和setTimeout的方法
2013/04/08 Javascript
关于jQuery $.isNumeric vs. $.isNaN vs. isNaN
2013/04/15 Javascript
js带按钮的提示框可供选择示例代码
2013/09/17 Javascript
js同源策略详解
2015/05/21 Javascript
使用AngularJS对路由进行安全性处理的方法
2015/06/18 Javascript
canvas实现手机端用来上传用户头像的代码
2016/10/20 Javascript
Vue2.0表单校验组件vee-validate的使用详解
2017/05/02 Javascript
jquery实现图片轮播器
2017/05/23 jQuery
jQueryUI Sortable 应用Demo(分享)
2017/09/07 jQuery
深入浅析ng-bootstrap 组件集中 tabset 组件的实现分析
2019/07/19 Javascript
javascript使用canvas实现饼状图效果
2020/09/08 Javascript
nuxt.js 在middleware(中间件)中实现路由鉴权操作
2020/11/06 Javascript
Python实现字典按照value进行排序的方法分析
2017/12/23 Python
Python图像处理模块ndimage用法实例分析
2019/09/05 Python
Python Pandas对缺失值的处理方法
2019/09/27 Python
Django后端发送小程序微信模板消息示例(服务通知)
2019/12/17 Python
python3.7通过thrift操作hbase的示例代码
2020/01/14 Python
详解python内置模块urllib
2020/09/09 Python
屈臣氏菲律宾官网:Watsons菲律宾
2020/06/30 全球购物
户外拓展活动方案
2014/02/11 职场文书
大龄毕业生求职别忘职业规划
2014/03/11 职场文书
《英英学古诗》教学反思
2014/04/11 职场文书
说明书怎么写
2014/05/06 职场文书
幼儿园区域活动总结
2014/05/08 职场文书
改作风抓落实促发展心得体会
2014/09/10 职场文书
2014年仓库保管员工作总结
2014/12/03 职场文书
校车司机安全责任书
2015/05/11 职场文书
python分分钟绘制精美地图海报
2022/02/15 Python