input选择图片后对图片转换和压缩处理

碎形独白
• 阅读 1527

我们常常在选择完图片后需要对图片进行处理,包括格式转换以及压缩等,最近遇到此场景,故整理汇总为如下:

// 图片处理, 输入文件,输出base64和文件
  dealImg(file: File, callback: any) {
    this.fileToBase64(file, (base64: any) => {
      this.compressImg(base64, (compressBase64: any) => {
        callback({
          base64,
          file: this.base64ToFile(compressBase64, file.name)
        });
      });
    });
  }

  // 获取图片用于展示,输入文件,输出base64
  fileToBase64(file: File, callback: any) {
    const fr = new FileReader();
    fr.onload = (evt: any) => {
      callback(evt.target.result);
    };
    fr.readAsDataURL(file);
  }

  // 图片压缩,输入base64,输出base64
  compressImg(base64: any, callback: any, w: number = 1000) {
    const newImage = new Image();
    const quality = 0.8;    // 压缩系数0-1之间
    newImage.src = base64;
    newImage.setAttribute("crossOrigin", 'Anonymous');    // url为外域时需要
    let imgWidth;
    let imgHeight;
    newImage.onload = function() {
      // @ts-ignore
      imgWidth = this.width;
      // @ts-ignore
      imgHeight = this.height;
      const canvas = document.createElement("canvas");
      const ctx = canvas.getContext("2d") as any;
      if (Math.max(imgWidth, imgHeight) > w) {
        if (imgWidth > imgHeight) {
          canvas.width = w;
          canvas.height = w * imgHeight / imgWidth;
        } else {
          canvas.height = w;
          canvas.width = w * imgWidth / imgHeight;
        }
      } else {
        canvas.width = imgWidth;
        canvas.height = imgHeight;
      }
      ctx.clearRect(0, 0, canvas.width, canvas.height);
      // @ts-ignore
      ctx.drawImage(this, 0, 0, canvas.width, canvas.height);
      const newBase64 = canvas.toDataURL("image/jpeg", quality);
      callback(newBase64); // 必须通过回调函数返回,否则无法及时拿到该值
    }
  }
  
  // 将base64转换为文件格式
  base64ToFile(base64: string, fileName: string): File {
    const arr = base64.split(',');
    // @ts-ignore
    const mime = arr[0].match(/:(.*?);/)[1];
    const bytes = atob(arr[1]);
    const bytesLength = bytes.length;
    const u8arr = new Uint8Array(bytesLength);
    for (let i = 0; i < bytes.length; i++) {
      u8arr[i] = bytes.charCodeAt(i);
    }
    const blob = new Blob([u8arr], { type: mime })
    return new File([blob], fileName, {
      type: 'image/jpeg'
    });
  }

调用方式如下:

// 单个文件处理,如果有有多文件可以遍历处理
onSingleFileChange(e: any) {
    const files = e.target.files;
    this.dealImg(files[0], (result: any) => {
      console.log(result);
    });
  }
点赞
收藏
评论区
推荐文章
blmius blmius
4年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
美凌格栋栋酱 美凌格栋栋酱
7个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Wesley13 Wesley13
3年前
Java日期时间API系列31
  时间戳是指格林威治时间1970年01月01日00时00分00秒起至现在的总毫秒数,是所有时间的基础,其他时间可以通过时间戳转换得到。Java中本来已经有相关获取时间戳的方法,Java8后增加新的类Instant等专用于处理时间戳问题。 1获取时间戳的方法和性能对比1.1获取时间戳方法Java8以前
Jacquelyn38 Jacquelyn38
4年前
手把手教你实现一个图片压缩工具(Vue与Node的完美配合)
前言图片压缩对于我们日常生活来讲,是非常实用的一项功能。有时我们会在在线图片压缩网站上进行压缩,有时会在电脑下软件进行压缩。那么我们能不能用前端的知识来自己实现一个图片压缩工具呢?答案是有的。效果展示原图片大小:82KB压缩后的图片大小:17KB测试是不是特别good!!!看到上面的压缩后的图片,可能你还会质疑图片的清晰度,那么看下面(第一张图为压缩后的图片
Wesley13 Wesley13
3年前
java对图片进行压缩和resize
序这里展示一下如何对图片进行压缩和resize。压缩publicstaticbooleancompress(Stringsrc,Stringto,floatquality){booleanrstrue;//Buildparam
浩浩 浩浩
4年前
【Flutter实战】图片和Icon
3.5图片及ICON3.5.1图片Flutter中,我们可以通过Image组件来加载并显示图片,Image的数据源可以是asset、文件、内存以及网络。ImageProviderImageProvider是一个抽象类,主要定义了图片数据获取的接口load(),从不同的数据源获取图片需要实现不同的ImageProvi
Aidan075 Aidan075
4年前
用python对图片批量压缩和格式转换
python作为简单、易学的编程语言,上手入门要容易许多。如果数据分析、机器学习、人工智能这些对你来说比较遥远,用python写一点实用的小脚本帮你解决问题、提高办公效率也是不错的。图片缩放、格式转换是一个常见的需求,网上虽然有许多这样的工具,但是下载站的质量参差不齐,如果没注意的话非常容易中招。这样不如自己用python写一个,安全有保障。主要
Stella981 Stella981
3年前
Linux递归压缩图片脚本
1压缩图片使用ImageMagick的convert命令进行压缩图片,一般只需要一个指定压缩质量的参数,比如:convertquality751.jpg1_compress.jpg可以支持压缩jpg/png/jpeg。2递归压缩递归压缩使用find配合g
Stella981 Stella981
3年前
Android 图片压缩工具,仿微信朋友圈压缩策略。
项目描述目前做App开发总绕不开图片这个元素。但是随着手机拍照分辨率的提升,图片的压缩成为一个很重要的问题。单纯对图片进行裁切,压缩已经有很多文章介绍。但是裁切成多少,压缩成多少却很难控制好,裁切过头图片太小,质量压缩过头则显示效果太差。于是自然想到App巨头“微信”会是怎么处理,Luban(鲁班)就是通过在微信朋友圈发送近10
Wesley13 Wesley13
3年前
Thinkphp压缩图片
/\\\desription压缩图片\@paramsting$imgsrc图片路径\@paramstring$imgdst压缩后保存路径\/publicfunctioncompressedImage($imgsrc,$imgdst){list($width,$height,$ty
燕青 燕青
1年前
Macos图片批量处理工具:PhotoMill X for Mac
PhotoMillXforMac是一款专业的图片处理软件,它可以帮助用户轻松快速地处理和转换大量图片。该软件具有操作简便、功能强大、处理速度快和支持多种图片格式等优点,特别适合需要处理大量图片的用户。PhotoMillX的Mac版具有的功能十分广泛,包括将