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获取远程图片并把它保存到本地的代码
Apr 07 PHP
php 将excel导入mysql
Nov 09 PHP
php和js如何通过json互相传递数据相关问题探讨
Feb 26 PHP
DOM XPATH获取img src值的query
Sep 23 PHP
PHP变量内存分配问题记录整理
Nov 27 PHP
Laravel 5.0 发布 新版本特性详解
Feb 10 PHP
PHP根据图片色界在不同位置加水印的方法
Jul 01 PHP
PHP Mysqli 常用代码集合
Nov 12 PHP
Zend Framework常用校验器详解
Dec 09 PHP
基于php数组中的索引数组和关联数组详解
Mar 12 PHP
PHP迭代器和迭代的实现与使用方法分析
Apr 19 PHP
laravel框架实现为 Blade 模板引擎添加新文件扩展名操作示例
Jan 25 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 记录进行累加并显示总时长为秒的结果
2011/11/04 PHP
php 判断是否是中文/英文/数字示例代码
2013/09/30 PHP
PHP中filter函数校验数据的方法详解
2015/07/31 PHP
删除PHP数组中头部、尾部、任意元素的实现代码
2017/04/10 PHP
PHP rmdir()函数的用法总结
2019/07/02 PHP
yii框架结合charjs统计上一年与当前年数据的方法示例
2020/04/04 PHP
PHP vsprintf()函数格式化字符串操作原理解析
2020/07/14 PHP
mouse_on_title.js
2006/08/25 Javascript
jquery下json数组的操作实现代码
2010/08/09 Javascript
JavaScript/jQuery 表单美化插件小结
2012/02/14 Javascript
jQuery插件animateSlide制作多点滑动幻灯片
2015/06/11 Javascript
详解参数传递四种形式
2015/07/21 Javascript
ES6正则表达式的一些新功能总结
2017/05/09 Javascript
原生JS获取元素的位置与尺寸实现方法
2017/10/18 Javascript
vue.js 实现评价五角星组件的实例代码
2018/08/13 Javascript
一文了解Vue中的nextTick
2019/05/06 Javascript
js实现盒子拖拽动画效果
2020/08/09 Javascript
Javascript柯里化实现原理及作用解析
2020/10/22 Javascript
[00:50]2014DOTA2国际邀请赛 NEWBEE战队回顾
2014/08/01 DOTA
[19:26]TNC vs EG (BO3)
2018/06/07 DOTA
Python内建模块struct实例详解
2018/02/02 Python
python list是否包含另一个list所有元素的实例
2018/05/04 Python
Python将一个CSV文件里的数据追加到另一个CSV文件的方法
2018/07/04 Python
python3 自动识别usb连接状态,即对usb重连的判断方法
2019/07/03 Python
Python命令行click参数用法解析
2019/12/19 Python
python小程序之4名牌手洗牌发牌问题解析
2020/05/15 Python
浅谈优化Django ORM中的性能问题
2020/07/09 Python
如何基于Python按行合并两个txt
2020/11/03 Python
html5 Canvas画图教程(5)—canvas里画曲线之arc方法
2013/01/09 HTML / CSS
Marc Jacobs彩妆官网:Marc Jacobs Beauty
2017/07/03 全球购物
夏尔巴人登珠峰品牌:Sherpa Adventure Gear
2018/02/08 全球购物
澳大利亚小众服装品牌:Maurie & Eve
2018/03/27 全球购物
工程部岗位职责
2015/02/10 职场文书
公司清洁工岗位职责
2015/04/15 职场文书
2015年销售内勤工作总结
2015/04/27 职场文书
JavaScript原始值与包装对象的详细介绍
2021/05/11 Javascript