js canvas 图片压缩 并转换为 file 类型文件

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script src="js/jquery-3.1.1.min.js"></script>
		<style type="text/css">
			
		</style>
	</head>
	<body>
		
		<input type="file" accept="image/*" onchange="getInfo(event)">
	</body>
	<script type="text/javascript">
		
		function getInfo(event){
		
			let reader = new FileReader();
			//这里把一个文件用base64编码
			reader.readAsDataURL(event.target.files[0]);			
			reader.onload = function(e){
				let newImg = new Image();
				//获取编码后的值,也可以用this.result获取
				newImg.src = e.target.result;
				newImg.onload = function () {
					/* 获取  this.height tthis.width*/
					var dataURL = compress(newImg,this.width,this.height,0.8);
					/*为了兼容ios 需要 dataURL-> blob -> file */
					var blob = dataURLtoBlob(dataURL);		// dataURL-> blob 
					var file = blobToFile(blob, '999');		// blob -> file
					console.log("得到文件:"+file);	
					console.log("压缩后大小:"+file.size/1024);				
					$("body").append("<img src='" + dataURL + "' />");
					
				}
			}
			
		}	
				
		function compress(img, width, height, ratio) { // img可以是dataURL或者图片url
			/*	如果宽度大于 750 图片太大 等比压缩 	*/
			if(width > 750){
				var ratio = width/height;
				width = 750;
				height = 750/ratio;
			}		
			var canvas, ctx, img64;
			canvas = document.createElement('canvas');
			canvas.width = width;
			canvas.height = height;
			
 
			ctx = canvas.getContext("2d");
			ctx.drawImage(img, 0, 0, width, height);
			/* canvas.toDataURL(mimeType(图片的类型), qualityArgument(图片质量)) */
			img64 = canvas.toDataURL("image/jpeg", ratio);
 
			return img64; // 压缩后的base64串
		}
		//将base64转换为blob
		function dataURLtoBlob (dataurl) { 
			var arr = dataurl.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 });
		}
		//将blob转换为file
		function blobToFile(theBlob, fileName){
		   theBlob.lastModifiedDate = new Date();
		   theBlob.name = fileName;
		   return theBlob;
		}
	</script>
</html>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以使用 HTML5 中的 FileReader 和 Canvas 对上传的图片进行压缩,然后再将压缩后的图片转换File 类型。 以下是一个示例代码: HTML: ```html <input type="file" id="fileInput"> ``` JavaScript: ```javascript // 获取文件输入框元素 const fileInput = document.getElementById('fileInput'); // 监听文件输入框的 change 事件 fileInput.addEventListener('change', function() { // 获取用户选择的文件 const file = fileInput.files[0]; // 创建 FileReader 对象 const reader = new FileReader(); // 读取文件内容 reader.readAsDataURL(file); // 在文件读取完成后执行回调函数 reader.onload = function(event) { // 创建 Image 对象 const img = new Image(); // 在图片加载完成后执行回调函数 img.onload = function() { // 创建 Canvas 对象 const canvas = document.createElement('canvas'); const ctx = canvas.getContext('2d'); // 设置 Canvas 的宽高 canvas.width = img.width; canvas.height = img.height; // 绘制图片到 Canvas 上 ctx.drawImage(img, 0, 0, img.width, img.height); // 将 Canvas 转换File 对象 canvas.toBlob(function(blob) { const compressedFile = new File([blob], file.name, { type: file.type, lastModified: file.lastModified, }); // 输出压缩后的文件 console.log(compressedFile); }, file.type, 0.7); }; // 加载图片 img.src = event.target.result; }; }); ``` 在这个示例代码中,我们首先获取文件输入框元素,并监听其 change 事件。当用户选择文件后,我们使用 FileReader 对象读取文件内容,并使用 Image 对象加载图片。在图片加载完成后,我们创建 Canvas 对象,并使用 drawImage 方法将图片绘制到 Canvas 上。然后,我们使用 toBlob 方法将 Canvas 转换为 Blob 对象,并使用 Blob 对象创建一个新的 File 对象,最后输出压缩后的文件。在 toBlob 方法中,第三个参数表示压缩质量,取值范围为 0 到 1,越接近 1 表示压缩质量越高。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值