关键词:
实现流程:
- 获取<input type="file">上传的文件;
- 使用FileReader读取图片,并新建一个Image对象将FileReader读取的图片数据放进去;
- 使用canvas将Image对象等比缩放并写入到画布中,保存为base64格式的数据(这里使用的是FormData对象上传,其实这里已经可以直接将base64的数据通过ajax使用post方法上传到服务器,即可避免下面两个步骤);
- 新建一个Blob对象将base64数据放入;
- 使用FormData对象上传到第三方云储存服务器;
使用HTML原生<input type="file">上传图片,下面是踩的一些小坑:
- accept设定上传文件的类型,这里直接用image/*,不指定具体的后缀名,否则部分安卓手机下无法上传图片;
- 添加multiple属性可选取多张图片(本例只做选取单张图片);
- capture="camera"属性可以调用摄像头(添加此属性在iPhone下会直接调用摄像头,而不会读取相册;且目前安卓和ios设备使用accept="image/*"均可选择使用摄像头拍照还是使用相册的图片,所以该属性可以忽略)。
<input id="imgUpload" type="file" onchange="addPic" accept="image/*" />
当input文件触发change事件后获取上传的文件
function addPic(e)
if (typeof FileReader === ‘undefined‘)
return alert(‘你的浏览器不支持上传图片哟!‘);
var files = e.target.files || e.dataTransfer.files;
if(files.length > 0)
imgResize(file[0], callback);
使用FileReader获取图片数据,并使用canvas压缩
- ios手机拍照会旋转90度,这里必须判断是否ios手机做出相应处理后再上传
function imgResize(file, callback)
var fileReader = new FileReader();
fileReader.onload = function()
var IMG = new Image();
IMG.src = this.result;
IMG.onload = function()
var w = this.naturalWidth, h = this.naturalHeight, resizeW = 0, resizeH = 0;
// maxSize 是压缩的设置,设置图片的最大宽度和最大高度,等比缩放,level是报错的质量,数值越小质量越低
var maxSize =
width: 500,
height: 500,
level: 0.6
;
if(w > maxSize.width || h > maxSize.height)
var multiple = Math.max(w / maxSize.width, h / maxSize.height);
resizeW = w / multiple;
resizeH = w / multiple;
else
// 如果图片尺寸小于最大限制,则不压缩直接上传
return callback(file)
var canvas = document.createElement(‘canvas‘),
ctx = canvas.getContext(‘2d‘);
if(window.navigator.userAgent.indexOf(‘iPhone‘) > 0)
canvas.width = resizeH;
canvas.height = resizeW;
ctx.rorate(90 * Math.PI / 180);
ctx.drawImage(IMG, 0, -resizeH, resizeW, resizeH);
else
canvas.width = resizeW;
canvas.height = resizeH;
ctx.drawImage(IMG, 0, 0, resizeW, resizeH);
var base64 = canvas.toDataURL(‘image/jpeg‘, maxSize.level);
convertBlob(window.atob(base64.split(‘,‘)[1]), callback);
;
fileReader.readAsDataURL(file);
将base64的数据转换成一个Blob对象
- 安卓手机不支持Blob构造方法
function convertBlob(base64, callback)
var buffer = new ArrayBuffer(base64.length);
var ubuffer = new Uint8Array(buffer);
for (var i = 0; i < base64.length; i++)
ubuffer[i] = base64.charCodeAt(i)
var blob;
try
blob = new Blob([buffer], type: ‘image/jpg‘);
catch (e)
window.BlobBuilder = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder || window.MSBlobBuilder;
if(e.name === ‘TypeError‘ && window.BlobBuilder)
var blobBuilder = new BlobBuilder();
blobBuilder.append(buffer);
blob = blobBuilder.getBlob(‘image/jpg‘);
callback(blob)
使用HTML5的FormData对象上传数据
function callback(fileResize)
var data = new FormData();
data.append(‘file‘, fileResize);
var config =
headers: ‘Content-Types‘: ‘multipart/form-data‘
;
// 这里用的es6语法发起请求,可以无视
axios.post(url, data, config).then().catch(e)
链接:https://www.jianshu.com/p/4587312d2f44
canvas使用canvas压缩图片大小
...些面试,其中有一个面试题是这样的,使用canvas怎样压缩图片大小这道题给我问蒙了,因为我没用过canvas压缩图片回去查资料,发现手机端在上传图片的时候,调起相机拍照的时候超过2m了,所以用到canvas压缩,优化用户体验解... 查看详情
canvas压缩图片的大小(代码片段)
使用 signature_padcanvas库生成的图片太大。但又没有提供方法来压缩。当然这是根据你canvas的画布大小决定的,某些原因导致我的画布就得是那么大。随随便便一个图片转化为base64之后就是200kb-300kb。所以得想办法压缩。思路就... 查看详情
图片压缩canvas
...:获取<inputtype="file">上传的文件;使用FileReader读取图片,并新建一个Image对象将FileReader读取的图片数据放进去;使用canvas将Image对象等比缩放并写入到画布中,保存为base64格式的数据(这里使用的是FormData对象上传,其实这... 查看详情
微信小程序图片压缩
参考技术A微信小程序图片压缩有三种方法,一种是使用官方提供的接口wx.compressImage(Objectobject);一种是通过压缩图片的大小,利用canvas重绘来得到压缩图片;最后一种安装第三方图片压缩包。由于第一种方法网上很多人说压缩... 查看详情
前端预览图片和h5canvas压缩图片上传
思路是将图片抽样显示在canvas上,然后用通过canvas.toDataURL方法得到base64字符串来实现压缩。1.base64转二进制文件/***dataURLtoblob,reftohttps://gist.github.com/fupslot/5015897*@paramdataURI*@returns{Blob}*/functiondataURItoBlob(dataURI){var 查看详情
前端通过canvas实现图片压缩
在一次的项目中,需要用户上传图片,目前市场随便一个手机拍出来的照片都是好几兆,直接上传特别占用带宽,影响用户体验,所以要求对用户上传图片进行压缩后再上传;那么前端怎么实现这个功能呢?亲测可将4M图片压缩... 查看详情
图片压缩传输(代码片段)
...动不动就是5,6兆,传输速度太慢,因此压缩一下。 对图片压缩 1varcanvas=document.createElement("canvas");2varctx=canvas.getContext(‘2d‘);3//瓦片canvas4vartCanvas=document.createElement("canvas");5var 查看详情
前端js利用canvas的drawimage()对图片进行压缩
对于大尺寸图片的上传,在前端进行压缩除了省流量外,最大的意义是极大的提高了用户体验。 这种体验包括两方面: 1、由于上传图片尺寸比较小,因此上传速度会比较快,交互会更加流畅,同时大大降低了网络... 查看详情
h5压缩图片上传(filereader+canvas)
因为最近项目做一个webApp的页面,需要上传图片,总结了一下,思路如下:一、监听一个 input(type=‘file‘)的change事件,然后拿到文件的file;<inputid="img-input"class="upload-input"type="file"accept="image/*"id="imgbox"multiple/>二、把file转... 查看详情
canvas图片压缩,局部放大,像素处理(代码片段)
直接上代码:(具体看注释)需要引用jquery.min.js<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><metahttp-equi 查看详情
js压缩上传图片base64长度
im发送图片,现将图片压缩再上传1)调用 FileReader 的 reader.readAsDataURL(img);方法,在其onload事件中,将用户选择的图片读入Image对象.2)在image对象的onload事件中,通过canvas的canvas.getContext(‘2d‘) 的drawImage方法,将Image改变大... 查看详情
前端js实现canvas压缩图片并上传(代码片段)
一.上传前压缩图片的好处可以减少用户的等待时间,提升使用体验,目前手机拍摄的图片文件大小一般在几M左右,文件直接上传时会有卡顿现象。可以减少服务端的存储空间。再次回去图片资源是也可以快速的加载... 查看详情
前端js实现canvas压缩图片并上传(代码片段)
一.上传前压缩图片的好处可以减少用户的等待时间,提升使用体验,目前手机拍摄的图片文件大小一般在几M左右,文件直接上传时会有卡顿现象。可以减少服务端的存储空间。再次回去图片资源是也可以快速的加载... 查看详情
html5fileapi加canvas实现图片前端js压缩并上传(转载)
一、图片上传前端压缩的现实意义对于大尺寸图片的上传,在前端进行压缩除了省流量外,最大的意义是极大的提高了用户体验。这种体验包括两方面:由于上传图片尺寸比较小,因此上传速度会比较快,交互会更加流畅,同时... 查看详情
img对象,file对象,base64,canvas对象相互转换以及图片压缩
先上一张图: 以上图片是js几乎所有图片类型的转换方式了。接下来讲讲几种常用的类型转换:1、urltoImage(url,fn)会通过一个url加载所需要的图片对象,其中url参数传入图片的url,fn为回调方法,包含一个Image对象的参数,代码如... 查看详情
图片压缩上传(代码片段)
图片压缩的方法//图片压缩compressImage(file,success,error)//图片小于1M不压缩//if(file.size<Math.pow(1024,2))//returnsuccess(file);//constname=file.name;//文件名constreader=newFileReader();reader.readAsDataURL(file);reader.onload=e=>constsrc=e.target.result;constimg=newImage... 查看详情
h5相机上传图片压缩
...设置压缩后的最大宽度or高度;//2、设置压缩比例,根据图片的不同size大小,设置不同的压缩比。functioncompress(res,fileSize){//res代表上传的图片,f 查看详情
前端图片压缩优化工具conversion
参考技术Aimage-conversion是一个简单易用的JS图片转换工具,提供了多种Image、Canvas、File和dataURL之间的转换方法。另外,image-conversion可以指定大小来压缩图片。1、将图像压缩到200kb:2、以0.9的质量压缩图像image-conversion提供了多种... 查看详情