AngularJS之手机端input图片上传(续)

PID控制器(位置式和增量式) PID控制算法 阅读详情

为啥要写个续呢?解决一个问题:图片压缩

BTW,本文是针对ajax提交,如果本身就是form表单提交就不需要看了。

上一篇里说到h5可以用FileReader获取到图片信息,如base64,按道理这就可以传给服务端了,但是当图片很大的时候,这个字符串可能会写满好几张a4纸,这显然不合适,再者字符串太大服务端也接受不到- -于是发送之前压缩一下是个不错的选择,上代码:

 var zipPic=function (result) {
      var canvas=document.getElementById("uploadImg");
      var cxt=canvas.getContext('2d');
      var img=new Image();
      img.src= result;
      canvas.width=640;
      canvas.height=640*(img.height/img.width);
      cxt.drawImage(img,0,0,640,canvas.height);
      return canvas.toDataURL("image/jpeg",0.9);
 }

cxt.drawImage会将result所代表的图片绘制到canvas上去,并且重新指定了图片的宽高,
drawImage有3个方法:
在画布上定位图像:
context.drawImage(img,x,y);
在画布上定位图像,并规定图像的宽度和高度:
context.drawImage(img,x,y,width,height);
剪切图像,并在画布上定位被剪切的部分:
context.drawImage(img,sx,sy,swidth,sheight,x,y,width,height);
具体参数意思可以到w3school去看。

canvas.toDataURL就是压缩过后的base64,第一个参数是格式,有的时候传的图片时png什么的都可以转成jpg,第二个参数可以理解为画面质量,0~1,很好理解。

ok,到此为止,一切都很美好,然而……
以上方法在Android上都运行正常,然后在ios上toDataURL取到的却是空,百度之,发现ios自带canvas坑(以下摘自http://www.cnblogs.com/zhwl/p/4961473.html):
首先是图片的大小,如果图片的大小超过两百万像素,图片也是无法绘制到canvas上的,调用drawImage的时候不会报错,但是你用toDataURL获取图片数据的时候获取到的是空的图片数据。
再者就是canvas的大小有限制,如果canvas的大小大于大概五百万像素(即宽高乘积)的时候,不仅图片画不出来,其他什么东西也都是画不出来的。

应对第一种限制,处理办法就是瓦片绘制了。瓦片绘制,也就是将图片分割成多块绘制到canvas上,我代码里的做法是把图片分割成100万像素一块的大小,再绘制到canvas上。
应对第二种限制,我的处理办法是对图片的宽高进行适当压缩,我代码里为了保险起见,设的上限是四百万像素,如果图片大于四百万像素就压缩到小于四百万像素。四百万像素的图片应该够了,算起来宽高都有2000X2000了。

定义两个canvas:

	var canvas = document.createElement("canvas");
    var ctx=canvas.getContext('2d');
    var tCanvas = document.createElement("canvas");
    var tctx = tCanvas.getContext("2d");代码片

压缩方法:

	//使用canvas对大图片进行压缩
    function compress(img) {
      var width = img.width;
      var height = img.height;
      //如果图片大于四百万像素,计算压缩比并将大小压至400万以下
      var ratio;
      if ((ratio = width * height / 4000000) > 1) {
        ratio = Math.sqrt(ratio);
        width /= ratio;
        height /= ratio;
      } else {
        ratio = 1;
      }
      canvas.width = width;
      canvas.height = height;
      // 铺底色
      ctx.fillStyle = "#fff";
      ctx.fillRect(0, 0, canvas.width, canvas.height);
      //如果图片像素大于100万则使用瓦片绘制
      var count;
      if ((count = width * height / 1000000) > 1) {
        count = ~~(Math.sqrt(count) + 1); //计算要分成多少块瓦片
      // 计算每块瓦片的宽和高
        var nw = ~~(width / count);
        var nh = ~~(height / count);
        tCanvas.width = nw;
        tCanvas.height = nh;
        for (var i = 0; i < count; i++) {
          for (var j = 0; j < count; j++) {
            tctx.drawImage(img, i * nw * ratio, j * nh * ratio, nw * ratio, nh * ratio, 0, 0, nw, nh);
            ctx.drawImage(tCanvas, i * nw, j * nh, nw, nh);
          }
        }
      } else {
        ctx.drawImage(img, 0, 0, width, height);
      }
      //进行最小压缩
      var ndata = canvas.toDataURL('image/jpeg', 0.1);
      // console.log('压缩前:' + initSize);
      // console.log('压缩后:' + ndata.length);
      // console.log('压缩率:' + ~~(100 * (initSize - ndata.length) / initSize) + "%");
      tCanvas.width = tCanvas.height = canvas.width = canvas.height = 0;
      return ndata;
    }

压缩方法有了,还要注意一点就是调用的时候,我当时在这花了蛮久时间0.0

reader.onload = function (e) {
            var result=this.result;
            $scope.success.up = true;
            var img=new Image();
            img.src= result;

            var maxsize = 100 * 1024;
            if(result.length<=maxsize){
              transferImgSrc=result;
            }else {
              if(img.complete){//一定要等图片加载完了再调压缩
                callback();
              }else {
                img.onload=callback;
              }
              function callback() {
                transferImgSrc = compress(img);//此处得到base64
                img = null;
              }
            }
 }
            
使用rknn进行facenet部署 修改facenet网络的forward函数代码。 阅读详情

相关推荐

别再到处找DEM了!手把手教你免费下载90米、30米、12.5米全球高程数据(附国内网盘链接)

本文详细介绍了如何免费获取全球90米(SRTM3)、30米(ASTER GDEM)和12.5米(ALOS)高精度DEM数据,并提供了国内网盘链接以绕过国际平台访问障碍。通过对比不同数据源的特点和适用场景,帮助用户根据项目需求选择最合适的DEM数据,同时分享了数据处理和质量提升的实用技巧,实现从数据获取到应用的无缝衔接。

weixin_28725949的博客 668

tomcat结合nginx使用小结

相信很多人都听过nginx,这个小巧的东西慢慢地在吞食apache和IIS的份额。那究竟它有什么作用呢?可能很多人未必了解。 说到反向代理,可能很多人都听说,但具体什么是反向代理,很多人估计就不清楚了。摘一段百度百科上的描述: 反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给in...

编程人生 2072

MacOS Intel芯片实战:Docker Compose一键部署Dify全流程解析

本文详细解析了在搭载Intel芯片的MacOS系统上,使用Docker Compose一键部署开源LLM应用开发平台Dify的全流程。内容涵盖环境准备、Docker配置与镜像加速、代码拉取与配置初始化、服务启动与问题排查,以及访问验证与初步探索,旨在帮助开发者快速在本地搭建私有化AI应用开发环境。

ik678901234的博客 618

angular 上传图片并显示_angularjs实现多张图片上传并预览功能

本文实例为大家分享了angularjs上传多张图片并预览的具体代码,供大家参考,具体内容如下directive.js/** 多图片上传及预览指令(需指定图片类名)**/angular.module('routerModule').directive('fileModel', ['$parse', 'fileReader', function($parse, fileReader) {return ...

weixin_39990558的博客 360

PCIe 物理层(Physical Layer)详解

PCIe物理层关键技术解析 PCIe物理层作为协议栈底层核心,承担着比特流传输、链路训练与电气特性管理等关键功能。该层采用分层架构,包含逻辑物理层(负责编解码/加扰)和电气物理层(处理信号收发)。关键技术亮点包括: 智能链路管理:通过LTSSM状态机实现11种状态转换,涵盖链路检测(Detect)、协商(Polling/Configuration)、功耗管理(L0s/L1)等全生命周期控制 高效编码方案:Gen1/Gen2采用8b/10b编码(20%开销),Gen3+升级为128b/130b(仅1.5%开销

珂珂可爱多 725

深度篇——图像处理的一些方法(一) 关于 图像处理的三个层次 与 selective search

返回主目录 返回 图像处理的一些方法 目录 下一章:深度篇——图像处理的一些方法(二)细说性能评估 IOU和 GIOU 目录内容 深度篇——图像处理的一些方法(一)关于图像处理的三个层次 与 selective search 深度篇——图像处理的一些方法(二)细说性能评估 IOU和 GIOU 深度篇——图像处理的一些方法(三)细说 HOG特征与bag-o...

天下所弃,不过其纪。世间事,在人,在志。 2916

angular 上传图片并显示_Angularjs实现上传图片预览功能

废话不多说了,直接给大家贴代码了,具体代码如下所示:app.factory("fileReader", function($q, $log) {var onLoad = function(reader, deferred, scope) {return function () {scope.$apply(function () {deferred.resolve(reader.result);})...

weixin_39947522的博客 384

【AI生成】 LoRa无中心自组网实现方案

LoRa技术是一种低功耗广域网通信技术,它采用了扩频频率调制技术,能够实现远距离的传输。LoRa在物联网中具有重要的应用价值,可以支持大规模的设备连接并且具有较低的成本。同时,LoRa具有高度的抗干扰能力和适应性,能够在复杂的环境中实现稳定的通信。通过使用无中心自组网实现方案,可以进一步提高LoRa网络的灵活性和可靠性,实现设备之间的智能互联。LoRa无中心自组网实现方案将为物联网应用提供更加便捷和高效的通信解决方案。LoRa无中心自组网实现方案一、无中心自组网概念及优势。

qq_31310977的博客 2088

Angularjs input file 上传文件

Angularjs 通过http post的方式来提交上传的图片,并实时预览图片上传结果

xiaoguangtouqiang的博客 5309

C#读取和写入excel表数据--手把手教详解

C#读写excel数据详解

如如水的博客 4054

【车载以太网】【架构】整体架构与协议标准

车载以太网架构图 应用层:DHCP /SOMEIP/DoIP/XCP/UDPNM 传输层:TCP/IP 网络层:IPv4/IPv6/ARP/ICMP 链路层:IEEE Ethernet MAC+VLAN 物理层:Ethernet PHY: 100BASE-T1/1000BASE-T1/100BASE-Tx

专注汽车软件开发、AutoSAR、车载以太网、SOA、EE架构。 8354

angularJs上传图片、设定图片宽高及图片预览

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;封装angularJs上传图片的指令多不胜数,只能上传图片,无法判断图片的宽高,往往对于某些特定的界面,想要最好的客户体验必须上传特定比例或大小的图片。封装一个功能齐全的指令可以剩下很多重复工作。 上传图片 &lt;!DOCTYPE html&gt; &lt;html lang="en"&gt; &

qq_27868533的博客 2161

uniapp - 热更新提示:WGT安装包中manifest.json文件不存在 | unexpected EOF!报错详细解决,完美搞定WGT安装包中WWW目录下manifest.json不存在问题

uniapp,安卓android,苹果ios,热更新,热更新code:-1202报错,,WGT热更新报错,uniapp热更新wgt出现报错manifest.json文件不存,uniapp安卓苹果软件热更新时出现错误unexpected EOF!如何解决,怎么解决热更新wgt报错,app新版本下载安装报错WGT安装包中manifest.json文件不存在,WGT安装包中WWW目录下manifest.json不存在,uniapp热更新报错安装失败[-1201]:WGT/WGTU文件格式错误,uniapp-wgt

✅ 精选推荐文章 1万+

AngularJS之手机端input图片上传

呐,好久不见,今天要说的是input上传图片,主角上场~ <input type="file" capture="camera" accept="image/*"> 其实只要type=”file”这个属性就够了,但是由于这边是在手机上访问,要能够调起手机的照相机和相册,所以就需要有后面的属性了。现在如果我已经在相册选择一张图片了,那怎么获取图片数据呢? 传统做法就是加上onchange

leebin_20的博客 3979

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

angularjs手机webapp 利用input拍照,图库选择上传图片

1.html ATM会员 2.directive .directive('fileModel', ['$parse', function ($parse) { return {

qq_27717857的博客 1486

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

终于拿下Angularjs中自定义上传文件!!!

2018年,新的一天,新的开始,今天终于把这个优化的需求改好了,记录一下。 2017年岁末的时候,我开始听知乎live,听了一篇忘记名字的大咖讲到,养成写博客的习惯,即可以帮助有需要的人,更重要的是能够帮你提升思维,特别是在技术遇到瓶颈时,写下一篇解决问题的技术博客,有助于重燃激情,废话不多讲… 实现需求: 1.根据设置的不同,可能有多个上传功能 2.流程是初始化为“上传表格”,选

sinat_36193631的博客 6885

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

在angularjs客户端压缩图片文件然后上传

主要是利用html5的canvas来进行图片的压缩,然后转化为dataURL,再有dataURL转化为Blob文件,Blob对象可以直接赋值给Formdata. app.service('Util', function($q) { var dataURItoBlob = function(dataURI) { // convert base64/URLEnc

alexwang1983的专栏 8790

angularjs手机webapp 利用input拍照,图库选择、缩略图显示 上传图片(一)

运行后的截图: html代码 <ul class="list_img"> <li ng-repeat="imageSrc in imgshows track by $index"> <img ng-src="{{imageSrc}}" alt=""> ...

xuehu837769474的博客 889

angularjs上传图片控件

点击打开链接 必须导入以下文件 var app = angular.module('app', ['angularFileUpload']); app.controller('uploadController',['$scope', 'FileUploader', function($scope, F

吃瓜群众的博客 1095

angular ng2-file-upload 上传多视频、多图片,并本地预览;后端C#接收

做好的效果展示: 1、 安装ng2-file-upload npm install ng2-file-upload --save 2、集成到module中 在appmodule中: import { FileUploadModule } from 'ng2-file-upload'; @NgModule({ imports: [ BrowserModule, FormsM...

weixin_42706227的博客 4344

ionic-基于javascript实现超级好用的移动端图像裁剪上传

在移动端的app中,经常都需要有一个功能,头像图片上传,在上传前可以进行裁剪,预览,最后再上传,虽然现在网上有很多开源的插件可以实现,但是最近腾讯开源的一个很好用的插件,就是应用于腾讯一系列产品的Alloyfinger。腾讯alloyteam团队http://www.alloyteam.com 下面的这个demo是基于alloyerfinger的: 矩形裁剪图片: 圆形裁剪图

bingcool 4618

angularjs 图片上传 回显

function imgFile(file) { var reader = new FileReader(); $scope.guid = (new Date()).valueOf(); //通过时间戳创建一个随机数,作为键名使用 reader.onload = function (ev) { $scope.$apply(function () {

YangZe的博客 2542

AngularJS 上传图片 手机端 安卓内置浏览器 无法上传

angularJS提供了强大的上传组件ng-file-upload 但是里面的属性有的浏览器不兼容。导致同样的代码,PC,safari都没问题,只有在安卓上会出现问题,要么无法选择图片,要么选择图片后上传失败,错误代码如下:<span class="zc-add-img"> <input class="zc-file" id="file" name="" type="" ng-model="

Demons丶的博客 1177

angular图片上传

html代码: 当input出发change事件会调用touchUpdateImg方法,传入file对象和需要展示得到imgsmall属性,通过FileReader对象读取文件对象,我使用了apply进行了监听,之前不使用apply进行了监听,之前不使用apply进行了监听,之前不使用apply时,没有实时展示图片。 &lt;div class="imglist"&gt; ...

一念执着。c的博客 3350

AngularJS中使用HTML5手机摄像头拍照

1. 项目背景 公司开发一个网站,在做用户头像修改的时候领导提到增加一个由摄像头拍照实现修改头像的功能。因为我们网站是基于Html5进行开发,所以就直接采用H5来实现拍照。起初觉得这个功能很简单,但是做的时候才发现并不是那么简单的。 这是在AngularJs中成功实现调用摄像头拍照并截图上传的例图: 2. 如何调用摄像头 ? 1 2 3 4

Larry的博客 4277

angularjs 图片上传

&lt;input type="file" alt="选择图片..." ngf-select="uploadFiles($files,$invalidFiles)" ng-model="img.file" name="img.file" ngf-pattern="'image/*'" ngf-accept="'ima

snrzk的博客 1232
上一篇: Java文件下载(excel)
下一篇: AngularJS跨域和session失效问题
leebin_20
博客等级 码龄12年 17粉丝 28原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值