[html] 如何使用html5进行图片压缩上传?

haizhilin2013
2020-03-10 04:37:11 星期二
html
                    
                        
如何使用html5进行图片压缩上传?
Comments per page
< Page 1 / 1 >
chisfee 2020-03-10 00:56:28

涉及到H5图片压缩,第一应该想到的是canvas的图片处理api。
先利用canvas.toDataURL('"image/jpeg",quality)中的quality参数进行图片压缩范围是0~1之间,再将图片base64格式转化为blob对象,最后使用formData和正常图片上传流程一样。

lincimy 2020-03-10 03:42:15

1.获取到图片的base64格式;
2.图片加载完成后,把图片转化为canvas;
3.使用canvas的toDataURL按照自己的需要进行压缩;
4.把dataURL转化成blob对象;
5.把blob对象转化成formData对象,最后按照ajax接口调用方式提交;

webVueBlog 2020-03-10 14:01:38

H5:进行图片压缩上传

<canvas canvas-id='attendCanvasId' class='myCanvas' :style="'width:' + imageSize.imageWidth + 'px; height:' + imageSize.imageHeight  + 'px;'"></canvas>

imageSize: '',

压缩代码:

// 压缩图片
paressImage: function(image, fn) {
	let img = new Image()
	// 要给对象图片的路径
	img.src = image.path
	let canvas = document.createElement('canvas');
	let ctx = canvas.getContext('2d')
	// 最大尺寸限制
	var maxWidth = 500,
		maxHeight = 500;
	var canvasWidth, canvasHeight;
	// 取得压缩后得高宽
	if (image.width > image.height) {
		if (image.width > maxWidth) {
			canvasWidth = maxWidth;
			canvasHeight = image.height * (canvasWidth / image.width)
		} else {
			canvasWidth = image.width;
			canvasHeight = image.height;
		}
	} else {
		if (image.height > maxHeight) {
			canvasHeight = maxHeight;
			canvasWidth = image.width * (canvasHeight / image.height);
		} else {
			canvasWidth = image.width;
			canvasHeight = image.height;
		}
	}
	canvas.width = canvasWidth
	canvas.height = canvasHeight
	// 图片画在画布上
	ctx.drawImage(img, 0, 0, canvasWidth, canvasHeight)
	// 图片资源
	canvas.toBlob((fileSrc) => {
		console.log('fileSrc', fileSrc)
		var imgSrc = window.URL.createObjectURL(fileSrc)
		fn(imgSrc);
	}, 'image/png', 0.50);

},

图片上传:

uploadFile

url: this.$store.state.baseUrl + '/manage/upload/upload_file',
filePath: imgSrc,
fileType: 'image',
name: 'file',
...
var obj = JSON.parse(uploadFileRes.data)
this.query.image = obj.data.img_url
longhui520 2020-03-10 14:44:09
   function photoCompress(file,options, callback) {
       var ready = new FileReader();
       ready.readAsDataURL(file);
       ready.onload = function () {
           var base64Url = this.result;
           canvasDataURL(base64Url, options, callback)
       }
    }
    //options可以是设置压缩后的图片的宽高或者压缩比例
    function canvasDataURL(base64Url, options, callback) {
       var img = new Image();
       img.src = base64Url;
       img.onload = function () {
           var that = this;
           // 默认按比例压缩
           var w = that.width,
               h = that.height,
               scale = w / h;
           w = options.width || w;
           h = options.height || (w / scale);
           var quality = 0.7; // 默认图片质量为0.7
           //生成canvas
           var canvas = document.createElement('canvas');
           var ctx = canvas.getContext('2d');
           // 创建属性节点
           var anw = document.createAttribute("width");
           anw.nodeValue = w;
           var anh = document.createAttribute("height");
           anh.nodeValue = h;
           canvas.setAttributeNode(anw);
           canvas.setAttributeNode(anh);
           ctx.drawImage(that, 0, 0, w, h);
           // 图像质量
           if (options.quality && options.quality <= 1 && options.quality > 0) {
               quality = options.quality;
           }
           // quality值越小,所绘制出的图像越模糊
           var base64 = canvas.toDataURL('image/jpeg', quality);
           // 回调函数返回base64的值
           callback(base64);
       }
       function convertBase64UrlToBlob(urlData) {
           var arr = urlData.split(','),
               mime = arr[0].match(/:(.*?);/)[1],
               bstr = atob(arr[1]),
               n = bstr.length,
               u8arr = new Uint8Array(n);
           while (n--) {
               u8arr[n] = bstr.charCodeAt(n);
           }
           return new Blob([u8arr], {
               type: mime
           });
       }
       photoCompress(file,{quality:0.1},function(base64Codes){
           var bob = convertBase64UrlToBlob(base64Codes);
           //修改文件名或上传
       })
       //1. 获取到文件对象,转成base64URL,
       //2. 根据base64URL 获取到图片的宽高,生成canvans
       //3. canvans 对象根据压缩比例,生成base64URL
       //4. base64URL生成blob对象
排行榜
今日答题答题排行
    未答的题
    更多>
      【关注作者公众号】 以面试驱动学习--前端剑解
      【公众号推荐】 不折腾的前端和咸鱼有什么区别

      学习不打烊,充电加油只为遇到更好的自己,365天无节假日,每天早上5点纯手工发布前端知识点(死磕自己,愉悦大家)。希望大家在这浮夸的前端圈里,保持冷静,坚持每天花20分钟来学习与思考。在这千变万化,类库层出不穷的前端,建议大家不要等到找工作时,才狂刷题,提倡每日学习!欢迎大家关注3+1开源项目!希望大家每人去学习与思考!(不要为了谁而来,要为自己而努力!

      【关注官方公众号】 每天4:30-5:00推送
      【公众号推荐】 一起折腾前端算法
      【微信学习群】 备注3+1