JavaScript图片处理大揭秘!掌握文件流处理方法

news2024/11/15 23:21:39

说在前面

💻作为一名前端开发,我们平时也少不了对文件流数据进行处理,今天简单整理一下日常开发中比较常见的一些处理文件流的场景及处理方法,希望可以帮助到大家,挤出多一点的摸鱼学习时间。

常见场景

一、input框上传文件

带有 type="file"<input> 元素允许用户可以从他们的设备中选择一个或多个文件。选择后,这些文件可以使用提交表单的方式上传到服务器上,或者通过 Javascript 代码和文件 API 对文件进行操作。

如下代码:

<input type="file" id="fileInput" />

<script>
  const input = document.getElementById("fileInput");
  input.onchange = (e) => {
    const file = e.target.files[0];
    console.log(file);
  };
</script>

image.png

如上图,通过inpu框选择文件上传之后,我们可以获取到我们上传的文件对象,那么我们应该怎样将获取到的文件对象更好的展示出来呢?

1、选择图片文件并在页面上显示

这种情况我们可以将获取到的文件对象转换为base64字符,再将其赋予img标签的src属性即可,这里我们需要使用到FileReader对象来进行读取。

FileReader 对象允许 Web 应用程序异步读取存储在用户计算机上的文件(或原始数据缓冲区)的内容,使用 FileBlob 对象指定要读取的文件或数据。

其中 File 对象可以是来自用户在一个<input>元素上选择文件后返回的FileList对象,也可以来自拖放操作生成的 DataTransfer对象,还可以是来自在一个HTMLCanvasElement上执行mozGetAsFile()方法后返回结果。

详细的介绍和更多的使用文档都可以上MDN进行查看,这里我也就不过多赘述了。

想要获取文件的base64 编码,我们可以使用readAsDataURL 方法来读取:

readAsDataURL 方法会读取指定的 BlobFile 对象。读取操作完成的时候,readyState 会变成已完成DONE,并触发 loadend 事件,同时 result 属性将包含一个data:URL 格式的字符串(base64 编码)以表示所读取文件的内容。

具体代码如下:

<input type="file" id="fileInput" />
<img alt="" id="uploadImg" src="" style="width: 100px; height: 100px" />
<div id="uploadText"></div>
<script>
  const input = document.getElementById("fileInput");
  input.onchange = (e) => {
    const file = e.target.files[0];
    const type = file.type.split("/")[0];
    console.log("type", type);
    switch (type) {
      case "image":
        dealImg(file);
        break;
  };
  function dealImg(file) {
    fileToBase64(file)
      .then((base64String) => {
        console.log("Base64:", base64String);
        const uploadImg = document.getElementById("uploadImg");
        uploadImg.setAttribute("src", base64String);
      })
      .catch((error) => {
        console.error("Error:", error);
      });
  }
  function fileToBase64(file) {
    return new Promise((resolve, reject) => {
      const reader = new FileReader();
      reader.onload = () => {
        resolve(reader.result);
      };
      reader.onerror = (error) => {
        reject(error);
      };
      reader.readAsDataURL(file);
    });
  }
</script>

image.png

2、选择text文本文件并在页面上显示文件内容

首先我们先创建一个txt文件,并写入一些内容:

image.png

想要获取文件的文本内容,我们可以使用readAsText 方法来读取:

readAsText 方法可以将 Blob 或者 File 对象转根据特殊的编码格式转化为内容 (字符串形式)

具体代码如下:

<input type="file" id="fileInput" />
<img alt="" id="uploadImg" src="" style="width: 100px; height: 100px" />
<div id="uploadText"></div>
<script>
  const input = document.getElementById("fileInput");
  input.onchange = (e) => {
    const file = e.target.files[0];
    const type = file.type.split("/")[0];
    console.log("type", type);
    switch (type) {
      case "text":
        dealText(file);
        break;
    }
  };
  function dealText(file) {
    readFile(file)
      .then((text) => {
        const uploadText = document.getElementById("uploadText");
        uploadText.innerHTML = text;
      })
      .catch((error) => {
        console.error("Error:", error);
      });
  }
  function readFile(file) {
    return new Promise((resolve, reject) => {
      const reader = new FileReader();
      reader.onload = (event) => {
        resolve(event.target.result);
      };
      reader.onerror = (event) => {
        reject(error);
      };
      reader.readAsText(file); // 使用readAsText方法读取文件内容
    });
  }
</script>

image.png

二、将img标签图片转换为DataURL数据类型或Blob数据类型

1、将图片转换为 DataUR 数据类型

我们首先获取到 img 标签元素。然后创建一个 canvas 元素,并获取其 2D 上下文。根据图像的宽度和高度设置 canvas 的宽度和高度。接着使用 drawImage 方法将 img 元素中的图像绘制到 canvas 上。最后,使用 toDataURL 方法即可将 canvas 中的内容转换为 DataURL 数据类型,具体代码如下:

  function imgToDataUrl() {
    const imgElement = document.getElementById("uploadImg"); // 获取 img 标签元素
    const canvas = document.createElement("canvas");
    const context = canvas.getContext("2d");
    canvas.width = imgElement.width;
    canvas.height = imgElement.height;
    // 在画布上绘制图片
    context.drawImage(imgElement, 0, 0);
    // 将画布内容转换为 DataURL
    const dataUrl = canvas.toDataURL("image/png");
    console.log(dataUrl); // 输出 DataURL 数据
  }
2、将图片转换为 Blob 数据类型

前面canvas绘制图片的步骤是一样的,只是这里最后使用了canvas的toBlob方法来进行转换,需要注意的是toBlob方法中的几个参数:

toBlob(callback, type, quality)
  • callback

回调函数,可获得一个单独的 Blob 对象参数。如果图像未被成功创建,可能会获得 null 值。

  • type 可选

DOMString 类型,指定图片格式,默认格式(未指定或不支持)为 image/png

  • quality 可选

Number 类型,值在 0 与 1 之间,当请求图片格式为 image/jpeg 或者 image/webp 时用来指定图片展示质量。如果这个参数的值不在指定类型与范围之内,则使用默认值,其余参数将被忽略。

function imgToBlob() {
    const imgElement = document.getElementById("uploadImg"); // 获取 img 标签元素
    const canvas = document.createElement("canvas");
    const context = canvas.getContext("2d");
    canvas.width = imgElement.width;
    canvas.height = imgElement.height;
    // 在画布上绘制图片
    context.drawImage(imgElement, 0, 0);
    // 将画布内容转换为 Blob
    canvas.toBlob(function (blob) {
      // 处理获取到的 Blob 数据
      console.log(blob);
    }, "image/png");
  }

获取到的Blob 数据如下:
image.png

三、图片压缩

我们可以使用JavaScrip对图片进行质量压缩来缩小图片大小,具体使用到的方法是上面提到的toBlob(callback, type, quality),我们可以通过其第三个参数来对质量进行压缩。

  function doCompress() {
    imgToBlob((blob) => {
      console.log("原图片", blob);
      compressImage(blob, Infinity, Infinity, 0.9).then((res) => {
        console.log("压缩质量为0.9得到图片", res);
      });
    });
  }
  function compressImage(file, maxWidth, maxHeight, quality) {
    return new Promise((resolve, reject) => {
      const reader = new FileReader();
      reader.readAsDataURL(file);
      reader.onload = function (event) {
        const img = new Image();
        img.src = event.target.result;
        img.onload = function () {
          let width = img.width;
          let height = img.height;

          if (width > maxWidth || height > maxHeight) {
            const ratio = Math.max(width / maxWidth, height / maxHeight);
            width /= ratio;
            height /= ratio;
          }

          const canvas = document.createElement("canvas");
          canvas.width = width;
          canvas.height = height;

          const ctx = canvas.getContext("2d");
          ctx.drawImage(img, 0, 0, width, height);

          canvas.toBlob(
            function (blob) {
              resolve(blob);
            },
            "image/jpeg",
            quality
          );
        };
      };
      reader.onerror = function (error) {
        reject(error);
      };
    });
  }
  function imgToBlob(cb) {
    const imgElement = document.getElementById("uploadImg"); // 获取 img 标签元素
    const canvas = document.createElement("canvas");
    const context = canvas.getContext("2d");
    canvas.width = imgElement.width;
    canvas.height = imgElement.height;
    // 在画布上绘制图片
    context.drawImage(imgElement, 0, 0);
    // 将画布内容转换为 Blob
    canvas.toBlob(function (blob) {
      // 处理获取到的 Blob 数据
      cb(blob);
    }, "image/png");
  }

上面代码定义了一个名为compressImage的函数,它接受四个参数:file(要压缩的文件),maxWidth(最大宽度),maxHeight(最大高度)和quality(图像质量,范围从0到1)。

在函数内部,我们首先使用FileReader读取文件,并将其转换为Data URL。然后,我们创建一个Image对象并将Data URL赋给它。在图像加载完成后,我们根据指定的最大宽度和高度来调整图像大小。

接下来,我们使用<canvas>元素创建一个画布,并设置其宽度和高度。然后,我们在画布上通过drawImage方法绘制图像,将其缩放到适当的大小。

最后,我们使用toBlob方法将画布内容转换为Blob对象,并将其以指定的JPEG格式和质量解析。最终返回压缩后的Blob对象。

具体效果如下:

image.png

image.png

image.png

四、图片加水印

这个之前有单独写了一篇文章,感兴趣的同学可以到这里《javaScript 给图片加水印》查看。

公众号

https://mp.weixin.qq.com/s/psp6iky3YYDl8chs-1nq-A

关注公众号『前端也能这么有趣』,获取更多新鲜内容。

说在后面

🎉 这里是 JYeontu,现在是一名前端工程师,有空会刷刷算法题,平时喜欢打羽毛球 🏸 ,平时也喜欢写些东西,既为自己记录 📋,也希望可以对大家有那么一丢丢的帮助,写的不好望多多谅解 🙇,写错的地方望指出,定会认真改进 😊,偶尔也会在自己的公众号『前端也能这么有趣』发一些比较有趣的文章,有兴趣的也可以关注下。在此谢谢大家的支持,我们下文再见 🙌。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1271143.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

uniapp + electron 打包项目

参考文献 1、控制台安装electron和electron打包工具electron-packager npm install electron -g npm install electron-packager -g2、manifest.json修改 运行的基础路径修改为&#xff1a;./ 不然打包出来会出现白屏&#xff0c;读取不到&#xff0c;因为打包出来的h5默认加…

强大的Kubernetes工具的完整指南

在容器化应用程序编排方面&#xff0c;Kubernetes是市场的领导者。它允许用户在多主机环境中管理容器&#xff0c;提供工作负载分配和网络处理。 此外&#xff0c;它还提供了许多在DevOps过程中至关重要的特性&#xff0c;例如自动扩展、自动修复和负载平衡。这些功能解释了Kub…

xcconfig(环境变量) 的使用

xcconfig&#xff08;环境变量&#xff09; 的使用 文章目录 xcconfig&#xff08;环境变量&#xff09; 的使用一、上手使用1、添加 xcconfig 文件2、在文件中添加数据3、将文件配置到工程中4、使用环境变量5、使用 Pod 的项目 二、语法1、注释&#xff1a;2、包含语句&#x…

C语言之“可变参数<stdarg.h>”

目录 前言 stdarg.h头文件 实例&#xff1a;遍历并求和所有传递给sum函数的额外实际参数 前言 有时我们会希望函数带有可变数量的参数就像printf&#xff08;cosnt char* format ...&#xff09;和scanf&#xff08;cosnt char* format ...&#xff09;那样除了有一个参数 …

ArkTS-文本滑动选择器弹窗

文本滑动选择器弹窗 根据指定的选择范围创建文本选择器&#xff0c;展示在弹窗上。 示例 Entry Component struct TextPickerDialogExample {State select: number 2private fruits: string[] [苹果, 香蕉, 橘子, 梨儿, 桃儿]build() {Row() {Column() {Text(当前选择为&…

windows系统bat脚本命令总结之reg命令

前言 做了一段时间的bat脚本开发&#xff0c;bat脚本中有各种各样的命令跟传统的编程逻辑完全不同&#xff0c;本专栏会讲解下各种各式的命令使用方法。 本篇文章讲解的是windows系统注册表操作命令"reg"。 reg命令简介 “reg” 是 Windows 操作系统中的一个命令行工…

关于前端学习的思考-浮动元素和块级元素的关系

先摆关系&#xff1a;浮动元素嵌套块级元素&#xff0c;浮动元素和块级元素是上下关系。 1、浮动元素为父盒子&#xff0c;块级元素为子盒子。 父盒子为浮动元素&#xff0c;子盒子不会继承。如图floatnone&#xff1b; 摆结论&#xff1a;子盒子为行内元素&#xff0c;行内块…

智能优化算法应用:基于群居蜘蛛算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于群居蜘蛛算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于群居蜘蛛算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.群居蜘蛛算法4.实验参数设定5.算法结果6.参考…

excel 计算断面水质等级

在工作中遇到根据水质监测结果要判断断面等级。写了下面的公式&#xff1a; 因子标准值 limits {COD: [15,15, 20, 15,20],氨氮: [0.15, 0.5, 1, 1.5, 2.0],总磷: [0.02, 0.1, 0.2, 0.3, 0.4] } excel公式&#xff1a; IFS(MAX(IF(M2>20,1,0), IF(N2>2,1,0), IF(O2&g…

夜莺项目发布 v6.4.0 版本,新增全局宏变量功能

大家好&#xff0c;夜莺项目发布 v6.4.0 版本&#xff0c;新增全局宏变量功能&#xff0c;本文为大家简要介绍一下相关更新内容。 全局宏变量功能 像 SMTP 的配置中密码类型的信息&#xff0c;之前都是以明文的方式在页面展示&#xff0c;夜莺支持全局宏变量之后&#xff0c;可…

SpringMvc集成开源流量监控、限流、熔断降级、负载保护组件Sentinel | 京东云技术团队

前言&#xff1a;作者查阅了Sentinel官网、51CTO、CSDN、码农家园、博客园等很多技术文章都没有很准确的springmvc集成Sentinel的示例&#xff0c;因此整理了本文&#xff0c;主要介绍SpringMvc集成Sentinel SpringMvc集成Sentinel 一、Sentinel 介绍 随着微服务的流行&…

SpringBoot Bean解析

Bean解析 IOC介绍 松耦合灵活性可维护 注解方式配置Bean 实现方式1: Component声明,直接类上进行添加注解, 同时保证包扫描能扫到即可实现方式2: 配置类中使用Bean Configuration public class BeanConfiguration implements SuperConfiguration{Bean("dog")Ani…

【开源】基于JAVA的大学计算机课程管理平台

项目编号&#xff1a; S 028 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S028&#xff0c;文末获取源码。} 项目编号&#xff1a;S028&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 实验课程档案模块2.2 实验资源模块2…

AtCoder Beginner Contest 330 A~F

A.Counting Passes(暴力) 题意&#xff1a; 给定 n n n个学生的分数&#xff0c;以及及格分 x x x &#xff0c;问多少人及格了。 分析&#xff1a; 暴力枚举&#xff0c;依次判断每个学生的分数即可。 代码&#xff1a; #include <bits/stdc.h> using namespace s…

Stability AI 新发布SDXL Turbo:一款实时文本到图像生成模型

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

Word异常退出文档找回怎么操作?4个正确恢复方法!

“刚刚我在用word编辑文档&#xff0c;但是突然word就显示异常了&#xff0c;然后莫名其妙就自动退出了&#xff0c;这可怎么办&#xff1f;我还有机会找回这些文档吗&#xff1f;” 当我们在使用Microsoft Word时&#xff0c;突然遭遇到程序异常退出的情况&#xff0c;可能会让…

四个方法,设置excel文件只读模式

由于excel文件经常用于数据文件&#xff0c;数据就需要特别保护&#xff0c;大家可能需要将文件设置为只读模式来保护数据不被修改&#xff0c;Excel文件想要设置为只读的方法有很多&#xff0c;今天分享四种方法给大家&#xff1a; 方法一&#xff1a;文件属性 右键点击文件…

面试篇之微服务(一)

目录 概览 1.什么是微服务&#xff1f; 2.微服务带来了哪些挑战&#xff1f; 3.现在有哪些流行的微服务解决方案&#xff1f; 这三种方案有什么区别吗&#xff1f; 4.说下微服务有哪些组件&#xff1f; 注册中心 5.注册中心是用来干什么的&#xff1f; 6.SpringCloud可…

Android Studio Giraffe-2022.3.1-Patch-3安装注意事项

准备工作&#xff1a; android studio下载地址&#xff1a;https://developer.android.google.cn/studio/releases?hlzh-cn gradle下载地址&#xff1a;https://services.gradle.org/distributions/ 比较稳定的网络环境&#xff08;比较android studio相关的依赖需要从谷歌那边…

spring cloud Eureka注册中心和Nacos注册中心

文章目录 Eureka注册中心.Eureka的结构和作用搭建eureka-server创建 服务引入eureka依赖编写启动类编写配置文件启动服务 服务注册1&#xff09;引入依赖2&#xff09;配置文件3&#xff09;启动多个user-service实例 服务发现1&#xff09;引入依赖2&#xff09;配置文件3&…