js中file、blob、base64的相互转换,前端图片压缩、裁剪、文件格式转换

2023-11-05

最近做了个前端图片压缩,用到了很多js文件操作api,整理一下防止健忘:

1. file转base64

/**
 * 获取文件的Base64
 * @param file      {File}      文件
 * @param callback  {Function}  回调函数,参数为获取到的base64
 */
function fileToBase64(file, callback) {
  const fileReader = new FileReader()
  fileReader.readAsDataURL(file)
  fileReader.onload = function () {
    callback(this.result)
  }
}

2. base64转blob

/**
 * Base64转Blob
 * @param dataURL   {String}  base64
 * @param mimeType	{String}  [可选]文件类型,默认为base64中的类型
 * @returns {File}
 */
function base64ToBlob(dataURL, mimeType = null) {
  const arr = dataURL.split(','),
  	defaultMimeType = arr[0].match(/:(.*?);/)[1],
  	bStr = atob(arr[1]),
  	n = bStr.length,
  	u8arr = new Uint8Array(n)
  let n = bStr.length
  while (n--) {
    u8arr[n] = bStr.charCodeAt(n)
  }
  return new Blob([u8arr], {type: mimeType || defaultMimeType})
}

3. blob转file

/**
 * Blob转File
 * @param blob     {Blob}   blob
 * @param fileName {String} 文件名
 * @param mimeType {String} 文件类型
 * @return {File}
 */
function blobToFile (blob, fileName, mimeType) {
  return new File([blob], fileName, {type: mimeType})
}

4. base64直接转file

/**
 * Base64转File
 * @param dataURL   {String}  base64
 * @param fileName	{String}  文件名
 * @param mimeType	{String}  [可选]文件类型,默认为base64中的类型
 * @returns {File}
 */
function base64ToFile(dataURL, fileName, mimeType = null) {
  const arr = dataURL.split(','),
  	defaultMimeType = arr[0].match(/:(.*?);/)[1],
  	bStr = atob(arr[1]),
  	n = bStr.length,
  	u8arr = new Uint8Array(n)
  let n = bStr.length
  while (n--) {
    u8arr[n] = bStr.charCodeAt(n)
  }
  return new File([u8arr], fileName, {type: mimeType || defaultMimeType})
}

5. 前端图片压缩和裁剪

/**
 * 图片压缩和尺寸裁剪
 * @param file          {File}      图片文件
 * @param quality       {Number}    生成图片质量,0.0~1.0之间,质量越小、文件越小、图片越模糊
 * @param callback      {Function}  回调方法,参数为原文件(小于阈值的情况下)或压缩后的新文件
 * @param sizeThreshold {Number}    [可选]大小阈值,单位:B,默认500K
 * @param targetWidth   {Number}    [可选]生成图片的宽度,单位:px,默认800
 * @param targetHeight  {Number}    [可选]生成图片的高度,单位:px,默认值按宽度自适应获取
 */
function pressImg (file, quality, callback, sizeThreshold = 512000, targetWidth = 800, targetHeight = null) {
  if (!file || !callback) {
    console.error('pressImg参数不完整!')
    return
  }
  if (!file.type.includes('image')) {
    console.error('文件格式非图片')
    return
  }

  fileToBase64(file, function (base64) {
    if (base64) {
      const image = new Image()
      image.src = base64
      image.onload = function () {
        if (file.size <= sizeThreshold && this.width <= targetWidth) {// 大小、宽度均小于阈值,则不需处理,返回原文件
          return callback(file)
        }
        const canvas = document.createElement('canvas')
        const context = canvas.getContext('2d')
        const scale = this.width / this.height
        canvas.width = targetWidth
        canvas.height = targetHeight || (targetWidth / scale)
        context.drawImage(image, 0, 0, canvas.width, canvas.height)
        const dataURL = canvas.toDataURL(file.type, quality)
        const newFile = base64ToFile(dataURL, file.name)
        callback(newFile)
      }
    }
  })
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

js中file、blob、base64的相互转换,前端图片压缩、裁剪、文件格式转换 的相关文章

随机推荐

  • Node.js

    Node js Node js基础 概念 简单的说 Node js 就是运行在服务端的 JavaScript Node js 是一个基于Chrome JavaScript 运行时建立的一个平台 Node js是一个事件驱动I O服务端Jav
  • (五)决策树

    一 决策树 决策树是监督学习算法 下面为一些样本 本质上是一种特征去结果的相关度 比如你的信贷情况与能否还贷的相关度肯定高 而你有没有结婚的相关度肯定低 二 信息增益 三 ID3算法
  • php 未支付取消订单,【php】用户提交订单,30分钟后没付款取消订单功能分析

    我先在要做这样的功能 用户在创建订单后 订单表中记入的是未付款状态 如果用户在30分钟后 还未付款 然后就把该订单给取消 关于用户创建订单 30分钟后还没付款 取消该订单的逻辑是怎么实现的 我自己的想了两个方案 1 客户端记入这个订单 如果
  • MindNode 5 for Mac(思维导图软件)中文版

    绘制流程图 思维导图 规划图 信息图等自然少不了这款MindNode 5 for Mac 作为优质的思维导图软件 mindnode5 mac破解版的功能很全面 添加文字 链接 图片 扩展注释等非常便捷 而且mindnode 5 破解版会智能
  • Rocketmq原理&最佳实践

    一 MQ背景 选型 消息队列作为高并发系统的核心组件之一 能够帮助业务系统解构提升开发效率和系统稳定性 主要具有以下优势 削峰填谷 主要解决瞬时写压力大于应用服务能力导致消息丢失 系统奔溃等问题 系统解耦 解决不同重要程度 不同能力级别系统
  • Python开发篇——基于React-Dropzone开发上传组件

    这次我要讲述的是在React Flask框架上开发上传组件的技巧 我目前主要以React开发前端 在这个过程中认识到了许多有趣的前端UI框架 React Bootstrap Ant Design Material UI Bulma等 而比较
  • Linux操作系统知识点总结

    1 什么是Linux系统 Linux 全称GNU Linux 是一种免费使用和自由传播的类UNIX操作系统 其内核由林纳斯 本纳第克特 托瓦兹 Linus Benedict Torvalds 于1991年10月5日首次发布 它主要受到Min
  • Qt 实现自定义Ui控件例子,以自定义的Slider为例(QWidget)

    说明 Qt可以比较方便地实现自定义控件在Qt Creator中使用 网上也有很多大神的控件可以使用 但是如果想要自己简单定制也可以按照这个流程 本文的要点 1 如何实现一个自定义控件 本文使用的方法有两个步骤 先在一个普通项目中实现使用 新
  • FreeRTOS学习笔记(3、信号量、互斥量的使用)

    FreeRTOS学习笔记 3 信号量 互斥量的使用 前言 往期学习笔记链接 学习工程 信号量 semaphore 两种信号量的对比 信号量的使用 1 创建信号量 2 give 3 take 4 删除信号量 使用计数型信号量实现同步功能 使用
  • zookeeper结构和命令

    zookeeper特性 1 Zookeeper 一个leader 多个follower组成的集群 2 全局数据一致 每个server保存一份相同的数据副本 client无论连接到哪个server 数据都是一致的 3 分布式读写 更新请求转发
  • 选择、插入、归并、希尔、快速排序算法性能比较总结

    1 概述 本文对比较常用且比较高效的排序算法进行了总结和解析 并贴出了比较精简的实现代码 包括选择排序 插入排序 归并排序 希尔排序 快速排序等 算法性能比较如下图所示 2 选择排序 选择排序的第一趟处理是从数据序列所有n个数据中选择一个最
  • MyBatis-扩展-PageHelpler分页插件使用

    PageHelper是MyBatis中非常方便的第三方分页插件 官方文档 https github com pagehelper MybatisPageHelper blob master README zh md 我们可以对照官方文档的说
  • tomcat的日志记录有哪些?

    Tomcat 是一个常用的 Java Web 服务器 它可以生成各种类型的日志记录 以下是 Tomcat 的一些常见日志记录 访问日志 Access Logs 记录所有进入 Tomcat 服务器的 HTTP 请求 这些日志包含有关请求的详细
  • jdk源码调试显示变量

    原文地址 http my oschina net xionghui blog 497361 Java是一门开源的程序设计语言 喜欢研究源码的java开发者总会忍不住debug一下jdk源码 虽然官方的jdk自带了源码包src zip 然而在
  • LeetCode 面试题01.01. 判定字符是否唯一的两种解法

    本文唯一重点 按位取与的运算优先级比较低 至少比 和 都低 注意加括号 题目概述 题解 一 哈希表 思路是简单的 用第一个下标做字符 第二个下标做字符出现的次数 先遍历一遍字符串 把次数都统计好 然后再遍历一遍字符串 如果查询到某个字符的c
  • 解决中文乱码问起

    Java对数据库进行CRUD操作出现乱码 先查看web xml有没有配置字符编码过滤器
  • es6把多个class方法合并在一起

    前言 es6新增的class方法 现在想把他们多个合并到一起 最终生成一个新方法出来 思路 我们新建3个文件 分别为index js login js main js login js 和 main js是两个 class函数 将他们合并到
  • Huggingface-4.8.2自定义训练

    Huggingface走到4 8 2这个版本 已经有了很好的封装 训练一个语言网络只需要调用Trainer train 即可完成 如果要根据自己的需求修改训练的过程 比如自定义loss 输出梯度 直接修改huggingface的源码显然是不
  • Spire.Doc系列教程:C# Word 图片替换

    Spire Doc支持在Word文档中对图片进行多种操作 如添加 提取 替换和删除等 本文主要介绍如何使用Spire Doc替换Word文档中的图片 在Spire Doc中 图片替换包含文本替换图片和图片替换图片两种方式 以下部分将对这两种
  • js中file、blob、base64的相互转换,前端图片压缩、裁剪、文件格式转换

    最近做了个前端图片压缩 用到了很多js文件操作api 整理一下防止健忘 1 file转base64 获取文件的Base64 param file File 文件 param callback Function 回调函数 参数为获取到的bas