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 相关文章推荐
3种平台下安装php4经验点滴
Oct 09 PHP
PHP 面向对象实现代码
Nov 11 PHP
PHP用GD库生成高质量的缩略图片
Mar 09 PHP
php中数组首字符过滤功能代码
Jul 31 PHP
CI(CodeIgniter)框架中的增删改查操作
Jun 10 PHP
PHP+jquery+ajax实现即时聊天功能实例
Dec 23 PHP
PHP数组实例详解
Jun 26 PHP
PHP在innodb引擎下快速代建全文搜索功能简明教程【基于xunsearch】
Oct 14 PHP
php中namespace及use用法分析
Dec 06 PHP
PHP生成图片缩略图类示例
Jan 12 PHP
PHP定义字符串的四种方式详解
Feb 06 PHP
PHP Post获取不到非表单数据的问题解决办法
Feb 27 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抽象工厂模式(Elgg)
2010/03/21 PHP
PHP微信红包API接口
2015/12/05 PHP
thinkPHP3.1验证码的简单实现方法
2016/04/22 PHP
PHP对象的浅复制与深复制的实例详解
2017/10/26 PHP
php实现根据身份证获取精准年龄
2020/02/26 PHP
yii2.0框架数据库操作简单示例【添加,修改,删除,查询,打印等】
2020/04/13 PHP
js判断IE6/IE7/FF的代码[XMLHttpRequest]
2011/02/16 Javascript
解析瀑布流布局:JS+绝对定位的实现
2013/05/08 Javascript
jquery实现选中单选按钮下拉伸缩效果
2015/08/06 Javascript
jQuery实现从身份证号中获取出生日期和性别的方法分析
2016/02/25 Javascript
JavaScript正则表达式小结(test|match|search|replace|split|exec)
2016/12/08 Javascript
JavaScript中的E-mail 地址格式验证
2018/03/28 Javascript
详解Angular模板引用变量及其作用域
2018/11/23 Javascript
如何在Angular应用中创建包含组件方法示例
2019/03/23 Javascript
vue获取验证码倒计时组件
2019/08/26 Javascript
JS实现网页烟花动画效果
2020/03/10 Javascript
详解Vue3 Composition API中的提取和重用逻辑
2020/04/29 Javascript
Python操作MongoDB数据库PyMongo库使用方法
2015/04/27 Python
TensorFlow中权重的随机初始化的方法
2018/02/11 Python
详解Python正则表达式re模块
2019/03/19 Python
Python自动生成代码 使用tkinter图形化操作并生成代码框架
2019/09/18 Python
Python基础之函数基本用法与进阶详解
2020/01/02 Python
python连接打印机实现打印文档、图片、pdf文件等功能
2020/02/07 Python
python 30行代码实现蚂蚁森林自动偷能量
2021/02/08 Python
使用CSS3滤镜的filter:blur属性制作毛玻璃模糊效果的方法
2016/07/08 HTML / CSS
100%羊绒:NakedCashmere
2020/08/26 全球购物
港湾网络笔试题
2014/04/19 面试题
给学校的建议书
2014/03/12 职场文书
我们的节日春节活动方案
2014/08/22 职场文书
审计局班子四风对照检查材料思想汇报
2014/10/07 职场文书
《植树问题》教学反思
2016/03/03 职场文书
PHP判断是否是json字符串
2021/04/01 PHP
Redis延迟队列和分布式延迟队列的简答实现
2021/05/13 Redis
mysql联合索引的使用规则
2021/06/23 MySQL
vue-cil之axios的二次封装与proxy反向代理使用说明
2022/04/07 Vue.js
在SQL Server中使用 Try Catch 处理异常的示例详解
2022/07/15 SQL Server