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 开发环境配置(Zend Server安装)
Apr 28 PHP
超级好用的一个php上传图片类(随机名,缩略图,加水印)
Jun 30 PHP
9个PHP开发常用功能函数小结
Jul 15 PHP
php格式化日期和时间格式化示例分享
Feb 24 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十一)
Jun 25 PHP
Yii使用Captcha验证码的方法
Dec 28 PHP
Joomla实现组件中弹出一个模式(modal)窗口的方法
May 04 PHP
php基于openssl的rsa加密解密示例
Jul 11 PHP
PHP Cookie学习笔记
Aug 23 PHP
完美解决phpexcel导出到xls文件出现乱码的问题
Oct 29 PHP
PHP5.5新特性之yield理解与用法实例分析
Jan 11 PHP
解决Laravel使用验证时跳转到首页的问题
Nov 17 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 Stream_*系列函数
2010/08/01 PHP
PHP图片自动裁切应付不同尺寸的显示
2014/10/16 PHP
基于Laravel 5.2 regex验证的正确写法
2019/09/29 PHP
php变量与字符串的增删改查操作示例
2020/05/07 PHP
ext form 表单提交数据的方法小结
2008/08/08 Javascript
Jquery实现无刷新DropDownList联动实现代码
2010/03/08 Javascript
jQuery boxy弹出层插件中文演示及使用讲解
2011/02/24 Javascript
WebGL利用FBO完成立方体贴图效果完整实例(附demo源码下载)
2016/01/26 Javascript
three.js实现围绕某物体旋转
2017/01/25 Javascript
angularJs使用$watch和$filter过滤器制作搜索筛选实例
2017/06/01 Javascript
用vue构建多页面应用的示例代码
2017/09/20 Javascript
js中json对象和字符串的理解及相互转化操作实现方法
2017/09/22 Javascript
Javascript 关于基本类型和引用类型的个人理解
2019/11/01 Javascript
[39:02]DOTA2亚洲邀请赛 3.31 小组赛 B组 Mineski vs VGJ.T
2018/04/01 DOTA
python实现html转ubb代码(html2ubb)
2014/07/03 Python
python进阶教程之函数参数的多种传递方法
2014/08/30 Python
python使用opencv进行人脸识别
2017/04/07 Python
浅析python递归函数和河内塔问题
2017/04/18 Python
Python实现随机生成手机号及正则验证手机号的方法
2018/04/25 Python
Python实现插入排序和选择排序的方法
2019/05/12 Python
pygame实现俄罗斯方块游戏(AI篇2)
2019/10/29 Python
Python字符串的修改方法实例
2019/12/19 Python
pandas的相关系数与协方差实例
2019/12/27 Python
Python 列表的清空方式
2020/01/13 Python
使用jupyter notebook直接打开.md格式的文件
2020/04/10 Python
keras的三种模型实现与区别说明
2020/07/03 Python
python使用列表的最佳方案
2020/08/12 Python
美国知名珠宝首饰品牌:Gemvara
2017/10/06 全球购物
材料物理专业大学毕业生求职信
2013/10/15 职场文书
学校卫生检查制度
2014/02/03 职场文书
护理专科学生自荐书
2014/07/05 职场文书
党员三严三实心得体会
2014/10/13 职场文书
教师批评与自我批评范文
2014/10/15 职场文书
2014年学习部工作总结
2014/11/12 职场文书
详解mysql三值逻辑与NULL
2021/05/19 MySQL
Mysql中@和@@符号的详细使用指南
2022/06/05 MySQL