h5页面利用canvas压缩图片并上传

摘要:
divi=“img”>vareleFile=document.querySelector(“#file”);img=newImage();varoriginHeight=this.height;}否则{targetHeight=maxHeight;targetWidth=Math.rround(maxHeight*(originWidth/originHeight));

由于现在手机拍摄的照片质量较高,为减轻服务器压力在上传图片时需要压缩后再进行上传。h5页面中压缩图片就需要用canvas来实现,通过固定canvas的宽高重绘图片,来达到压缩的目的。

<div style="margin:0 auto;60%;padding-top:80px;">
    <input   type="file" accept="image/jpeg,image/png">
    <div id="img"></div>  
</div>

<script>
    var eleFile = document.querySelector('#file');

    // 压缩图片需要的一些元素和对象
    var reader = new FileReader(), img = new Image();

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

    eleFile.addEventListener('change', function (event) {
        file = event.target.files[0];
        // 选择的文件是图片
        if (file.type.indexOf("image") == 0) {
            reader.readAsDataURL(file);
        }else{
            alert("不支持的文件格式!");
        }

    //增加获取照片旋转角度
     EXIF.getData(file, function() {
     Orientation = EXIF.getTag(this, 'Orientation');

    });
}); 
// 文件base64化,以便获知图片原始尺寸 
 reader.onload = function(e) {
    img.src = e.target.result; 
 }; 
// 缩放图片需要的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 = 500, maxHeight = 500; 
   //图片压缩后的宽高(单位像素) // 目标尺寸
   var targetWidth = originWidth,
       targetHeight = originHeight; 
// 图片尺寸超过500x500的限制  
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);
// 图片展示并旋转
    if(Orientation && Orientation != 1){
          console.log(Orientation)
         switch(Orientation){
            case 6:     
                 // 旋转90度
                 canvas.width = targetHeight;
                 canvas.height = targetWidth;
                 context.rotate(Math.PI / 2);
                 // (0,-imgHeight) 从旋转原理图那里获得的起始点
                 context.drawImage(this, 0, -targetHeight, targetWidth, targetHeight);
                 break;
          case 3:
                // 旋转180度
                context.rotate(Math.PI);
                context.drawImage(this, -targetWidth, -targetHeight, targetWidth, targetHeight);   
                break;
          case 8:
               // 旋转-90度
               canvas.width = imgHeight;
               canvas.height = imgWidth;
               context.rotate(3 * Math.PI / 2);
               context.drawImage(this, -targetWidth, 0, targetWidth, targetHeight);            
               break;
         }
    }else{
        context.drawImage(this, 0, 0, targetWidth, targetHeight);
    }

  // canvas转为blob并上传
   canvas.toBlob(function (blob) { 
    var newImg = new Image(); 
     newImg.src = URL.createObjectURL(blob);
    document.querySelector('#img').appendChild(newImg)  

     //展示图片
   //可直接以blob格式上传到服务器 
   }, file.type || 'image/png'); };
</script>

  最后补充一下,canvas.toBlob()的方法会有兼容问题(移动端目前发现问题的地方是某些手机直接拍照上传的时候)

  解决方法:引入了一个blob插件。CDN地址:https://cdn.bootcss.com/javascript-canvas-to-blob/3.14.0/js/canvas-to-blob.js

  还有部分手机上的照片上传之后会被默认旋转,使用插件exif.js可以获取照片旋转角度进行纠正,上方代码已补充。CDN地址:https://cdn.bootcss.com/exif-js/2.3.0/exif.js

免责声明:文章转载自《h5页面利用canvas压缩图片并上传》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇WCF NetTcpBinding 由于系统缓冲区空间不足或队列已满,不能执行套接字上的操作Appium+unittest+PageObject实例下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

U_Net原理及tensorflow的实现

Unet——用于图像边缘检测,是FCN的改进 如上图是UNET的架构图,可以发现器输入图像和输出图像不一致,如果我们需要输入图像和输出图像一致时,在卷积时,使用padding=“SAME”即可,然后再边缘检测时,就相当与像素级别的二分类问题,用交叉熵做loss函数即可。但位置检测常用IOU作为loss函数。 个人觉得UNET的优点: 1.Unet的去除了...

python的paramiko模块

    paramiko是用python语言写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接。paramiko支持Linux, Solaris, BSD, MacOS X, Windows等平台通过SSH从一个平台连接到另外一个平台。利用该模块,可以方便的进行ssh连接和sftp协议进行sftp文件传输。   paramiko常...

Sql Server:创建用户并指定该用户只能看指定的视图,除此之外的都不让查看

1,在sql server中选择好要操作的数据库   2,--当前数据库创建角色 exec sp_addrole 'seeview'      --创建了一个数据库角色,名称为:[seeview]   3,--分配视图权限 GRANT SELECT  ON veiw TO [角色]  --指定视图列表 指定seeview这个角色可以查看的视图表名称;也就是...

canvas基础—图形变换

1、canvas转换方法 1.1canvas转换方法 二、canvas实现图形的中心点旋转 step1:获取canva元素并指定canvas的绘图环境 var canvas=document.getElementById('canvas'); var context=canvas.getContext('2d'); step2:在画布(1...

mysql学习笔记(三)----函数

Mysql函数 数学函数 函数名 描述 Eg ABS(X) 绝对值 Select ABS(-2); PI() 圆周率 Select PI(); SQRT(X) 平方根 Select sqrt(X); MOD(X,Y) 求余 Select mod(4,3); CEIL(X) 返回不小于X的最小整数 Select ceil(3.5);...

selenium解决上传文件问题之总结

一、上传文件框是input形式 首先定位上传按钮 发送要上传的文件 driver.findElement(By.id("XX")).sendKeys("D:\20.jpg"); 利用Robot类处理文件上传。 其大致流程可以为: 1、 利用selenium点击web上本地文件的上传按钮; 2、 在弹出的弹框中,文件路径输入框默认的是光标的聚焦,将文件在...