上传图片时压缩图片 - 前端(canvas)做法

HTML前端代码:

<?php $this->layout(‘head‘); ?>
<?php $this->layout(‘sidebar‘); ?>
        <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
        <style type="text/css">
            #preview {
                display: inline-block;
                width: 24.56rem;
                height: 24.56rem;
                position: relative;
                background-image: url(img/iconfont-tianjia.png);
                background-repeat: no-repeat;
                background-size:cover ;
            }
            #file {
                /*width: 100%;*/
                height: 100%;
                /*opacity: 0;*/
                position: absolute;
                left: 0;
                top: 0;
                cursor: pointer;
                z-index: 5;
            }
        </style>
<!-- Content Wrapper. Contains page content -->
<div class="content-wrapper">
  <!-- Content Header (Page header) -->
  <section class="content-header">

  </section>

  <div class="col-md-12">
    <div class="box">
      <div class="box-header with-border">
        <h3 class="box-title">商品图库</h3>

      </div>

    <!-- 第一种 -->
    <input type="file" accept="image/*" name="picture"  id="file" value="点击" />
    <div id="preview"></div>

    <!-- 第二种 -->
    <input type="file" id="tesImg" onchange="tes(this)" />
    <img      id="tesId">
    <img      id="tesId1">
    <img      id="tesId2">

      <!-- /.box-header -->
      <div class="box-body" style="font-size: 1.3rem">

      </div><!-- /.box-body -->

      <div class="box-footer clearfix ">

      </div>
    </div><!-- /.box -->
  </div>
  <div class=" clearfix "></div>
</div>

<?php $this->layout(‘footer‘); ?>

<!-- 第一种 -->
<script type="text/javascript">
    var eleFile = document.querySelector(‘#file‘);
    var preview = document.querySelector(‘#preview‘);
    // 压缩图片需要的一些元素和对象
    var reader = new FileReader(),
    //创建一个img对象
        img = new Image();

    // 选择的文件对象
    var file = null;

    // 缩放图片需要的canvas
    var canvas = document.createElement(‘canvas‘);
    var context = canvas.getContext(‘2d‘);

    // base64地址图片加载完毕后
    img.onload = function() {
        // 图片原始尺寸
        var originWidth = this.width;
        var originHeight = this.height;
        // 最大尺寸限制,可通过设置宽高来实现图片压缩程度
        var maxWidth = 800,
            maxHeight = 800
        // 目标尺寸
        var targetWidth = originWidth,
            targetHeight = originHeight;
        // 图片尺寸超过400x400的限制
        if(originWidth > maxWidth || originHeight > maxHeight) {
            if(originWidth / originHeight > maxWidth / maxHeight) {
                // 更宽,按照宽度限定尺寸
                targetWidth = maxWidth;
                targetHeight = Math.round(maxWidth * (originHeight / originWidth));
            } else {
                targetHeight = maxHeight;
                targetWidth = Math.round(maxHeight * (originWidth / originHeight));
            }
        }
        // canvas对图片进行缩放
        canvas.width = targetWidth;
        canvas.height = targetHeight;
        // 清除画布
        context.clearRect(0, 0, targetWidth, targetHeight);
        // 图片压缩
        context.drawImage(img, 0, 0, targetWidth, targetHeight);
        /*第一个参数是创建的img对象;第二个参数是左上角坐标,后面两个是画布区域宽高*/
        //压缩后的图片base64 url
        /*canvas.toDataURL(mimeType, qualityArgument),mimeType 默认值是‘image/jpeg‘;
         * qualityArgument表示导出的图片质量,只要导出为jpg和webp格式的时候此参数才有效果,默认值是0.92*/
        var newUrl = canvas.toDataURL(‘image/jpeg‘, 0.8);//base64 格式
        $.post(
            ‘/business/test_canvas‘
            ,{img:newUrl}
            ,function(data){
                console.log(data);
            }
        );
        // console.log(canvas.toDataURL(‘image/jpeg‘, 0.92));return;
     preview.style.backgroundImage=‘url(‘ + newUrl + ‘)‘;
    };

    // 文件base64化,以便获知图片原始尺寸
    reader.onload = function(e) {
        img.src = e.target.result;
    };
    eleFile.addEventListener(‘change‘, function(event) {
        file = event.target.files[0];
        // 选择的文件是图片
        if(file.type.indexOf("image") == 0) {
            reader.readAsDataURL(file);
        }
    });
</script>

<!-- 第二种 -->
<script>
    /*
    var imgOb=new Image();
    var imgDom=$("#tesId");
    imgOb是图片对象,而imgDom是dom对象;
    imgDom[0]是图片对象,与imgOb一样。
    要想获取图片对象的宽与高
    必须等图片对象加载后才能获取
    imgOb.onload=function(e){
        alert(imgOb.width);
     alert(imgOb.width);
    }
   */
    function tes(ob){
        var file=ob.files[0];
        var reader=new FileReader();
        reader.readAsDataURL(file);
        reader.onload=function(e){
            var imgObj=new Image();
            imgObj.src=this.result;
            imgObj.onload=function(a){
                var canvas = document.createElement(‘canvas‘);
                canvas.width = 100;
                canvas.height = 100;
                var ctx = canvas.getContext("2d");
                ctx.drawImage(imgObj, 0, 0, 100, 100);
                $("#tesId").attr(‘src‘,canvas.toDataURL("image/jpeg", 0.9));
                canvas.width = 800;
                canvas.height = 800;
                ctx.drawImage(imgObj, 0, 0, 800, 800);
                var img = canvas.toDataURL("image/jpg", 0.1);
                $("#tesId1").attr(‘src‘,canvas.toDataURL("image/jpg", 0.1));
                $.post(
                    ‘/business/test_canvas‘
                    ,{img: img}
                    ,function(data){

                    }
                );
                canvas.width = 300;
                canvas.height = 100;
                ctx.drawImage(imgObj, 0, 0, 300, 100);
                $("#tesId2").attr(‘src‘,canvas.toDataURL("image/jpeg", 0.6));
            }
        }
    }
</script>

PHP后端接收前端 ajax方法传来base64格式图片保存:

    // 测试canvas
    public function test_canvas()
    {
        if($_POST){
            // echo new BasicReturn(true, 0, ‘‘, $_POST);

            $img = $_POST[‘img‘];
            $abs_path = \sdk\config\Config::getUpPath()[‘upload‘];
            $goods_path = "goods/" . date("Y/m/d/");  //图片上传路径
            if (!file_exists($abs_path . $goods_path))
                mkdir($abs_path . $goods_path, 0777, 1);
            $file_name = microtime(true) * 10000;
            $imgPath = $goods_path . $file_name;

            // 保存图片
            $type = $this->save_img_real($abs_path . $imgPath,$img);

        }
        $this->view(‘test_canvas‘);
    }

    private function save_img_real($path, $base64_image_content)
    {
        //匹配出图片的格式

        if (preg_match(‘/^(data:\s*image\/(\w+);base64,)/‘, $base64_image_content, $result)) {
            $type = $result[2];
            if ($type == ‘jpeg‘) {
                $type = ‘jpg‘;
            }
            if ($type == ‘jpg‘ || $type == ‘gif‘ || $type == ‘png‘) {
                if (file_put_contents($path . ‘.‘ . $type, base64_decode(str_replace($result[1], ‘‘, $base64_image_content)))) {
                    return $type;
                } else {
                    return false;
                }
            } else {
                return false;
            }
        } elseif (preg_match(‘/^(data:;base64,)/‘, $base64_image_content, $result)) {
            $img_data = base64_decode(str_replace($result[1], ‘‘, $base64_image_content));
            $types = $this->check_image_type($img_data);
            if ($types) {
                if (file_put_contents($path . ‘.‘ . $types, $img_data)) {
                    return $types;
                } else {
                    return false;
                }
            } else {
                return false;
            }
        }
    }

    private function check_image_type($image)
    {
        $bits = array(
            ‘jpg‘ => "\xFF\xD8\xFF",
            ‘gif‘ => "GIF",
            ‘png‘ => "\x89\x50\x4e\x47\x0d\x0a\x1a\x0a",
        );
        foreach ($bits as $type => $bit) {
            if (substr($image, 0, strlen($bit)) === $bit) {
                return $type;
            }
        }
        return false;
    }

需要注意的是:图片宽高 250 x 250 太小会失真,我这里就设置成 800 x 800

原文地址:https://www.cnblogs.com/pyspang/p/9567397.html

时间: 2024-08-27 16:58:41

上传图片时压缩图片 - 前端(canvas)做法的相关文章

上传图片时压缩图片 - 后端做法

/** * 函数:调整图片尺寸或生成缩略图 v 1.1 * @param $Image 需要调整的图片(含路径) * @param $Dw 调整时最大宽度;缩略图时的绝对宽度 * @param $Dh 调整时最大高度;缩略图时的绝对高度 * @param $Type 1,调整尺寸; 2,生成缩略图 * @return bool */ public function compressImg($image, $Dw, $Dh, $type) { if (!file_exists($image)) {

java上传图片并压缩图片大小

Thumbnailator 是一个优秀的图片处理的Google开源Java类库.处理效果远比Java API的好.从API提供现有的图像文件和图像对象的类中简化了处理过程,两三行代码就能够从现有图片生成处理后的图片,且允许微调图片的生成方式,同时保持了需要写入的最低限度的代码量.还支持对一个目录的所有图片进行批量处理操作.支持的处理操作:图片缩放,区域裁剪,水印,旋转,保持比例.另外值得一提的是,Thumbnailator至今仍不断更新,怎么样,感觉很有保障吧!Thumbnailator官网:h

js图片前端压缩多图上传(旋转其实已经好了只是手机端有问题要先压缩再旋转)

var filechooser = document.getElementById("choose"); // 用于压缩图片的canvas var canvas = document.createElement("canvas"); var ctx = canvas.getContext('2d'); // 瓦片canvas var tCanvas = document.createElement("canvas"); var tctx = tC

js压缩图片后再将base64转换为file文件亲测可用

<button id="upload">上传图片</button><input type="file" name="input_file" id="input_file" style="height: 84px; width: 111px;" /> var filechooser = document.getElementById("input_file&quo

HTML5 file API加canvas实现图片前端JS压缩并上传 (转载)

一.图片上传前端压缩的现实意义 对于大尺寸图片的上传,在前端进行压缩除了省流量外,最大的意义是极大的提高了用户体验. 这种体验包括两方面: 由于上传图片尺寸比较小,因此上传速度会比较快,交互会更加流畅,同时大大降低了网络异常导致上传失败风险. 最最重要的体验改进点:省略了图片的再加工成本.很多网站的图片上传功能都会对图片的大小进行限制,尤其是头像上传,限制5M或者2M以内是非常常见的.然后现在的数码设备拍摄功能都非常出众,一张原始图片超过2M几乎是标配,此时如果用户想把手机或相机中的某个得意图片

canvas前端压缩图片

参考网上的用法,下面是利用canvas进行的图片压缩 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta content="width=device-width,initial-scale=1.0,maximum-scale=1.0,user-scalable=no" name="viewport"> <meta c

canvas压缩图片

1.canvas.toDataUrl压缩图片 canvas的toDataUrl方法可以将内容导出为base64编码格式的图片,采用base64编码将比源文件大1/3,但是该方法可以指定导出图片质量,所以前端可实现上传图片的压缩.先通过fileApi拿到本地图片地址,然后新建一个Img元素,图片绘制到canvas中后再将其导出(压缩).例如: $(':file').on('change',function(){         var file = this.files[0];         v

前端压缩图片代码,支持移动端和pc 端,还有拍照后获取到的照片

1. upload   使用者调用的方法 2. rotateImg  旋转照片,用于把iOS拍照后获取到的图片摆正 3. dataURLtoFile 将压缩后的图片转为file 对象,区分一个 blob 和 base64, 兼容哪个就用哪个 4. 得先引入  exif-js  用于拿到图片信息,确定 iOS 怎么旋转的 1 import EXIF from 'exif-js' 2 var picValue = null, 3 headerImage = '', 4 imgName = '', 5

kindeditor上传图片自动压缩过大的图片

kindeditor上传图片时自动将过大(像素以及图片长宽)的图片进行压缩,只需要在kindeditor中upload_json.ashx里面修改! <%@ webhandler Language="C#" class="Upload" %> /** * KindEditor ASP.NET * * 本ASP.NET程序是演示程序,建议不要直接在实际项目中使用. * 如果您确定直接使用本程序,使用之前请仔细确认相关安全设置. * */ using Sys