input file 上传图片及压缩

input file 上传图片及压缩


大致需求为:可上传图片,同时压缩图片大小(因为手机图片一般都会有几兆,原图上传会耗损过多资源);并且可以上传之后显示出来 ,再提交给服务器;

<input    id="shangchuanimg" title=""   type="file" name="file" value="" onChange="showImage(this)" />
<ul class="ul"> 上传之后的图片矩阵 </div>

压缩的思路是创建一个图片,将file等于这个图片,然后创建一个canvas图层 ,将canvas等比例缩放,然后用canvas的drawImage将图片与canvas合起来,然后在转成吧canvas的base64转成file即可

function showImage(file, id) {
  if (file.files && file.files[0]) {
    for (let i = 0; i < file.files.length; i++) {
      console.log(file.files[i]) //拿到file对象
      let reader = new FileReader(); //读取file
      reader.readAsDataURL(file.files[i]);
      reader.onloadend = function(e) {
        let image = new Image() //新建一个img标签(还没嵌入DOM节点)
        image.src = e.target.result //将图片的路径设成file路径
        image.onload = function() { 
        //压缩的思路是创建一个图片,将file等于这个图片,然后创建一个canvas图层 ,将canvas等比例缩放,然后用canvas的drawImage将图片与canvas合起来,然后在转成吧canvas的base64转成file即可
            let canvas = document.createElement('canvas'), 
            context = canvas.getContext('2d'),
            imageWidth = image.width / 10,    //压缩后图片的大小
            imageHeight = image.height / 10,
            data = ''
            canvas.width = imageWidth
            canvas.height = imageHeight

            context.drawImage(image, 0, 0, imageWidth, imageHeight)
            data = canvas.toDataURL('image/jpeg')
            console.log(dataURLtoFile(data,'a'+imgnum))
            //压缩完成 
        
            var newfile = dataURLtoFile(data,'a'+imgnum+'.png');
          	var formFile = new FormData();
          	formFile.append('files', newfile );
         	//ajax()....ajax上传file
        }
			//上传之后预览小图
        $('.pz').before('<li class="fileimg isfile dis" num=' + first + '>' +
          '<img src=' + reader.result + ' alt="">' +
          '<span class="isclick"></span>' +
          '</li>')
        $('.ok').text('上传(' + imgnum + ')')
      }
    }
  }
}

function dataURLtoFile(dataurl, filename) { // base64转file对象
       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 File([u8arr], filename, {type:mime});
   }

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值