基本原理:

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

     /**
* @获取远程图片的体积大小 单位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. vb.net字符串格式转为日期型

    vb.net字符串格式转为日期型  比如 "20080815" 转换为"2008-05-15"Dim a As Date  Dim s As String = ...

  2. 两个APP之间怎么调用《IT蓝豹》

    两个app之间怎么调用?   (1):通过显示Intent 启动    首先:配置好B app 的action,即AndroidManifest.xml中声明 <intent-filter> ...

  3. 高效Web开发的10个jQuery代码片段

    原文转载:http://www.codeceo.com/article/10-jquery-snippets-web-dev.html

  4. 全面总结sizeof的用法(定义、语法、指针变量、数组、结构体、类、联合体、位域位段)

    一.前言 编译环境是vs2010(32位). <span style="font-size:18px;">#include<iostream> #inclu ...

  5. 查看linux中某个端口是否被占用

    1.netstat -tunlp | grep **** -t--tcp  -u--udp -l--listening -n --numeric -p--program -a--all 2.lsof ...

  6. Ubuntu如何更新源

    Ubuntu的源其实就是更新各种软件包需要用到镜像网站, 当大家在虚拟机上安装Linux镜像的时候肯定会遇到各种Linux软件没有安装,当你用apt-get安装的时候它会提示无效的网址,这个时候你就需 ...

  7. ANDROID开发之问题积累及解决方案(二)

    错误:“Binary XML file line # : Error inflating class” 原因:此异常是布局文件中有错引起的,那么返回到布局文件中看看. <?xml version ...

  8. .NET MVC TempData、ViewData、ViewBag

    说明: 原文作者贤新 原文地址:http://www.cnblogs.com/chenxinblogs/p/4852813.html ViewData和ViewBag主要用于将数据从控制器中传递到视图 ...

  9. php 验证码

    $im =imagecreate(500,500); $bak =imagecolorallocate($im,200,100,0); $shk = imagecolorallocate($im,0, ...

  10. easyui 中datagrid 点击行的事件

    $('#datagrid 的ID').datagrid({                onClickRow:function(index,data)                {        ...