基本原理:

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

     /**
* @获取远程图片的体积大小 单位byte
* @date 2016/9/23
* @author Jimmy
* @param $uri
* @param string $user
* @param string $pw
* @return string
*/
public static function remoteFilesize($uri, $user='', $pw='')
{
ob_start();
$ch = curl_init($uri);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_NOBODY, 1);
if (!empty($user) && !empty($pw)) {
$headers = array('Authorization: Basic ' . base64_encode($user.':'.$pw));
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
}
curl_exec($ch);
curl_close($ch);
$head = ob_get_contents();
ob_end_clean();
$regex = '/Content-Length:\s([0-9].+?)\s/';
preg_match($regex, $head, $matches);
return isset($matches[1]) ? $matches[1] : 'unknown';
}
     /**
* @desc 等比例压缩图片到指定KB大小
* @author Jimmy
* @date 2016/9/26
* @param $url 远程图片地址
* @param $maxSize 需要压缩的最终适合的大小KB
* @param $dirPath 文件存放的目录
* @param float $ratio 文件压缩系数(大于0小于1),该值越大,得到的压缩图片约接近指定的KB大小
* @return bool|string 压缩后文件存放路径
*/
public static function compressImageToSize($url,$maxSize,$dirPath,$ratio=0.9){
$fileLength=UtilityHelper::remoteFilesize($url);
$originSize=getimagesize($url);
$originWidth=$originSize[0];
$originHeight=$originSize[1];
$varWidth = $originWidth;
$varHeight = $originHeight;
if(!file_exists($dirPath)){
mkdir($dirPath);
}
$desPath = $dirPath. Uuid::createUuid().'.jpg';
if($fileLength/1024.0>$maxSize){//需要等比例压缩处理
while(true){
$currentWidth = intval($varWidth*$ratio);
$currentHeight = intval($varHeight*$ratio);
$varWidth = $currentWidth;
$varHeight = $currentHeight;
//生成缩略图片
$im=imagecreatefromjpeg($url);
$tn=imagecreatetruecolor($currentWidth, $currentHeight);
imagecopyresampled($tn, $im, 0, 0, 0, 0, $currentWidth, $currentHeight, $originWidth, $originHeight);
file_exists($desPath)&&unlink($desPath);
imagejpeg($tn, $desPath,100);
imagedestroy($tn);
$length=filesize($desPath)/1024.0;
if($length<$maxSize){
break;
}
}
}else{
file_put_contents($desPath,file_get_contents($url),true);
}
if(empty($desPath)){
return false;
}else{
return $desPath;
}
}

等比例压缩图片到指定的KB大小的更多相关文章

  1. C# 压缩图片到指定宽度,假如图片小于指定宽度 判断图片大小是否大于指定大小(KB) 如果大于则压缩图片质量 宽高不变

    class Program { static void Main(string[] args) {//G:\zhyue\backup\projects\Test\ConsoleApplication1 ...

  2. 处理页面载入图片js(等比例压缩图片)

    第一页面html  <div class="admin">${answer.content}</div> <div class="admin ...

  3. 最新javascript自动按比例显示图片,按比例压缩图片显示

    最新javascript自动按比例显示图片,按比例压缩图片显示 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//E ...

  4. java中判断图片格式并且等比例压缩图片

    最近项目中需要判断上传的图片必须是png,jpg,gif三种格式的图片,并且当图片的宽度大于600px时,压缩图片至600px,并且等比例的压缩图片的高度. 具体的实现形式: 大致的思路是: 判断根据 ...

  5. php等比例压缩图片

    <?php function resizeImage($im,$maxwidth,$maxheight,$name,$filetype) { $pic_width = imagesx($im); ...

  6. java上传并压缩图片(等比例压缩或者原尺寸压缩)

    本文转载自http://www.voidcn.com/article/p-npjxrbxr-kd.html 先看效果: 原图:1.33M 处理后:27.4kb 关键代码; package codeGe ...

  7. Java实现的上传并压缩图片功能【可等比例压缩或原尺寸压缩】

    本文实例讲述了Java实现的上传并压缩图片功能.分享给大家供大家参考,具体如下: 先看效果: 原图:1.33M 处理后:27.4kb 关键代码: package codeGenerate.util; ...

  8. ios压缩图片

    /** *  压缩图片到指定文件大小 * *  @param image 目标图片 *  @param size  目标大小(最大值) * *  @return 返回的图片文件 */ - (NSDat ...

  9. java 上传图片压缩图片

    package com.bitspace.flame.util; import java.io.File; import java.awt.Image;import java.awt.image.Bu ...

随机推荐

  1. PHP中使用cURL实现Get和Post请求的方法

    1.cURL介绍  cURL 是一个利用URL语法规定来传输文件和数据的工具,支持很多协议,如HTTP.FTP.TELNET等.最爽的是,PHP也支持 cURL 库.本文将介绍 cURL 的一些高级特 ...

  2. sublime text 3 安装 pakcage control

        安装sublime的pakcage control 参考:  https://packagecontrol.io/installation#st3 ctrl+`   import urllib ...

  3. 关于UI系统的问题

    function OnGUI(){ GUI.skin = myskin; if(GUILayout.Button("add_component",GUILayout.Height( ...

  4. mongodb遇到的错误

    1. [root@localhost bin]# ./mongod -dbpath /data/db --logpath /usr/local/mongodb/log --13T18:: F CONT ...

  5. dma_ops

    kernel中的dma缓存区管理层操作统一实现在  struct dma_map_ops 中: dma缓存区分配函数的具体实现参考: http://www.aichengxu.com/view/599 ...

  6. (C语言)数组与指针的区别

    以前常常听过这种说法,说数组和指针这两者比较像,但是不能混淆,可是一直没能理解.刚刚在李云的<专业嵌入式软件开发>中,看了讲述数组与指针区别的一章,似乎有所领悟.本着知乎上看到的这张图,我 ...

  7. SQL语句中=null和is null

    平时经常会遇到这两种写法:IS NOT NULL与!=NULL.也经常会遇到数据库有符合条件!=NULL的数据,但是返回为空集合.实际上,是由于对二者使用区别理解不透彻. 默认情况下,推荐使用 IS ...

  8. ABP 仓储VIEW实现

    每个view实体加个ID 对应实体属性配置到View的列 View添加一列类似自增序列 ROW_NUMBER() OVER(ORDER BY getdate()) AS ID codefirst时 删 ...

  9. easyui treegrid逐步加载

    $("#bomStructureTable").treegrid({ url : "systemcontroller?id=10007",//首次查询路径 qu ...

  10. AppScan 测试需要输入用户名密码的网站

    Cisco有专门的网页版的AppScan,使用前需要向有关的team申请account和权限. account和权限申请成功后,登录AppScan网站,创建自己的文件夹目录,然后在自己的目录下新建sc ...