博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
等比例压缩图片到指定的KB大小
阅读量:6227 次
发布时间:2019-06-21

本文共 2934 字,大约阅读时间需要 9 分钟。

基本原理:

取原来的图片,长宽乘以比例,重新生成一张图片,获取这张图片的大小,如果还是超过预期大小,继续在此基础上乘以压缩比例,生成图片,直到达到预期

 

1     /** 2      * @获取远程图片的体积大小 单位byte 3      * @date 2016/9/23 4      * @author Jimmy 5      * @param $uri 6      * @param string $user 7      * @param string $pw 8      * @return string 9      */10     public static  function remoteFilesize($uri, $user='', $pw='')11     {12         ob_start();13         $ch = curl_init($uri);14         curl_setopt($ch, CURLOPT_HEADER, 1);15         curl_setopt($ch, CURLOPT_NOBODY, 1);16         if (!empty($user) && !empty($pw)) {17             $headers = array('Authorization: Basic ' . base64_encode($user.':'.$pw));18             curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);19         }20         curl_exec($ch);21         curl_close($ch);22         $head = ob_get_contents();23         ob_end_clean();24         $regex = '/Content-Length:\s([0-9].+?)\s/';25         preg_match($regex, $head, $matches);26         return isset($matches[1]) ? $matches[1] : 'unknown';27     }

 

 

1     /** 2      * @desc 等比例压缩图片到指定KB大小 3      * @author Jimmy 4      * @date 2016/9/26 5      * @param $url 远程图片地址 6      * @param $maxSize 需要压缩的最终适合的大小KB 7      * @param $dirPath 文件存放的目录 8      * @param float $ratio 文件压缩系数(大于0小于1),该值越大,得到的压缩图片约接近指定的KB大小 9      * @return bool|string 压缩后文件存放路径10      */11     public static function compressImageToSize($url,$maxSize,$dirPath,$ratio=0.9){12         $fileLength=UtilityHelper::remoteFilesize($url);13         $originSize=getimagesize($url);14         $originWidth=$originSize[0];15         $originHeight=$originSize[1];16         $varWidth = $originWidth;17         $varHeight = $originHeight;18         if(!file_exists($dirPath)){19             mkdir($dirPath);20         }21         $desPath = $dirPath. Uuid::createUuid().'.jpg';22         if($fileLength/1024.0>$maxSize){
//需要等比例压缩处理23 while(true){24 $currentWidth = intval($varWidth*$ratio);25 $currentHeight = intval($varHeight*$ratio);26 $varWidth = $currentWidth;27 $varHeight = $currentHeight;28 //生成缩略图片29 $im=imagecreatefromjpeg($url);30 $tn=imagecreatetruecolor($currentWidth, $currentHeight);31 imagecopyresampled($tn, $im, 0, 0, 0, 0, $currentWidth, $currentHeight, $originWidth, $originHeight);32 file_exists($desPath)&&unlink($desPath);33 imagejpeg($tn, $desPath,100);34 imagedestroy($tn);35 $length=filesize($desPath)/1024.0;36 if($length<$maxSize){37 break;38 }39 }40 }else{41 file_put_contents($desPath,file_get_contents($url),true);42 }43 if(empty($desPath)){44 return false;45 }else{46 return $desPath;47 }48 }

 

转载于:https://www.cnblogs.com/JimmyBright/p/5956392.html

你可能感兴趣的文章
js html5推送 实例
查看>>
ASP.NET div信息提示框显示几秒后隐藏
查看>>
常用的正则表达式C#工具类
查看>>
IOS适配
查看>>
WhyDX9:翻写D3D红龙书中的程序
查看>>
RFC 4627 JSON
查看>>
UML类图
查看>>
Flex父子窗体相互调用
查看>>
AP_应付模组在月结的处理
查看>>
javascript如何判断访问网页的设备及是否支持触屏功能
查看>>
MFC 虚函数与消息映射区别
查看>>
每日一小练——列出全部子集
查看>>
[再寄小读者之数学篇](2014-06-23 Bernstein's inequality)
查看>>
微信公众平台开发(98) UnionID
查看>>
《CLR via C#》读书笔记 之 线程基础
查看>>
Linux中的lo回环接口详细介绍
查看>>
玩转Web之servlet(三)---一张图看懂B/S架构
查看>>
Neutron中的Service类
查看>>
MCU开发之I2C通信
查看>>
angular学习笔记(二十七)-$http(5)-使用$http构建RESTful架构
查看>>