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验证手机号码(支持归属地查询及编码为UTF8)
Feb 01 PHP
PHP里8个鲜为人知的安全函数分析
Dec 09 PHP
php中异常处理方法小结
Jan 09 PHP
php实现Mongodb自定义方式生成自增ID的方法
Mar 23 PHP
php递归实现无限分类的方法
Jul 28 PHP
php将数组存储为文本文件方法汇总
Oct 28 PHP
ThinkPHP中where()使用方法详解
Apr 19 PHP
PHP Header用于页面跳转时的几个注意事项
Oct 21 PHP
php获取当前url地址的方法小结
Jan 10 PHP
php根据用户名和手机号查询是否存在手机号码
Feb 16 PHP
PHP输出Excel PHPExcel的方法
Jul 26 PHP
Thinkphp5框架异常处理操作实例分析
Jun 03 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中调用ASP.NET的WebService的代码
2011/04/22 PHP
PHP数组操作汇总 php数组的使用技巧
2011/07/17 PHP
php 文章调用类代码
2011/08/11 PHP
谈谈 PHP7新增功能
2015/12/16 PHP
thinkPHP导出csv文件及用表格输出excel的方法
2015/12/30 PHP
解决PHP上传非标准格式的图片pjpeg失败的方法
2017/03/12 PHP
详解如何在云服务器上部署Laravel
2017/06/30 PHP
php实现和c#一致的DES加密解密实例
2017/07/24 PHP
php/JS实现的生成随机密码(验证码)功能示例
2019/06/06 PHP
Yii使用EasyWechat实现小程序获取用户的openID的方法
2020/04/29 PHP
我见过最全的个人js加解密功能页面
2007/12/12 Javascript
Jquery从头学起第四讲 jquery入门教程
2010/08/01 Javascript
浏览器的JavaScript引擎的识别方法
2013/10/20 Javascript
基于jquery扩展漂亮的CheckBox(自己编写)
2013/11/19 Javascript
对于jQuery性能的一些优化建议
2015/08/13 Javascript
深入理解Commonjs规范及Node模块实现
2017/05/17 Javascript
vue cli3.0 引入eslint 结合vscode使用
2019/05/27 Javascript
vue-cli3配置与跨域处理方法
2019/08/17 Javascript
微信小程序实现左侧滑栏过程解析
2019/08/26 Javascript
Python socket C/S结构的聊天室应用实现
2014/11/30 Python
python实现多线程暴力破解登陆路由器功能代码分享
2015/01/04 Python
Python浅拷贝与深拷贝用法实例
2015/05/09 Python
Python操作SQLite/MySQL/LMDB数据库的方法
2019/11/07 Python
Python ORM编程基础示例
2020/02/02 Python
详解PyQt5信号与槽的几种高级玩法
2020/03/24 Python
如何在windows下安装配置python工具Ulipad
2020/10/27 Python
python 实现的车牌识别项目
2021/01/25 Python
GNC健安喜官方海外旗舰店:美国著名保健品牌
2017/01/04 全球购物
复古斯堪的纳维亚儿童服装:Baby go Retro
2017/09/09 全球购物
Bed Bath & Beyond加拿大官网:购买床上用品、浴巾、厨房电器等
2019/10/04 全球购物
abstract class和interface有什么区别?
2012/01/03 面试题
ktv收银员岗位职责
2013/12/16 职场文书
求职面试个人自我评价
2014/02/28 职场文书
租赁意向书范本
2014/04/01 职场文书
专科应届毕业生求职信
2014/06/04 职场文书
研究生求职自荐书
2014/06/23 职场文书