玩转图片流

做了一款图片识别软件,应用到了图片流,预览,Blob,Base64,以及类型转换等技术。这些技术在图片相关开发中必不可少,这一次,让我们玩转「图片流」吧!

一、常见场景

我们先来看一下图片的使用场景:

  • 通过 input 上传;
  • 文件拖拽上传;
  • 图片预览;
  • 图片数据存储;
  • 第三方接口需要;

当然,实际的应用远远比这些复杂,但是我们如果掌握了核心思想,那么无非就是「图片流」的获取和转换,下面让我们逐步深入吧!

二、说说图片流

上面提到了「图片流」,其实就是用二进制流来表示图片,也就是我们常说的「二进制图片」。

计算机的存储在物理上是都二进制的,所以文本文件与二进制文件的区别并不是物理上的,而是逻辑上的。


可能有人要问了,为什么要用二进制来表示图片呢?我们来看看二进制的优势:
  1. 二进制文件比较节约空间,在储存字符型数据时与普通存储并没有差别。但是在储存数字,特别是实型数字时,二进制更节省空间;
  2. 内存中参加计算的数据都是用二进制无格式储存起来的,因此,使用二进制储存到文件就更快捷。如果储存为文本文件,则需要一个转换的过程。在数据量很大的时候,两者就会有明显的速度差别了; 
  3. 涉及到一些比较精确的数据,使用二进制储存不会造成有效位的丢失;

看到这里,相信大家已经对图片流有了一定的认识。既然提到了存储,补充说明一下图片在后端存储方式:

  • 其一:可以将图片以独立文件的形式存储在服务器的指定文件夹中,再将路径存入数据库字段中;
  • 其二:将图片转换成二进制流,直接存储到数据库的 Image 类型字段中;
三、FileReader 是什么?

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

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

官话说了一大堆,其实你只需要知道「它是用来读取文件的」就够了。


参数说明如下:
  • FileReader.error(只读):一个 DOMException,表示在读取文件时发生的错误 ;
  • FileReader.readyState(只读):表示 FileReader 状态的数字。取值如下:
    • EMPTY 0 还没有加载任何数据.
    • LOADING 1 数据正在被加载.
    • DONE 2 已完成全部的读取请求.
  • FileReader.result(只读):文件的内容。该属性仅在读取操作完成后才有效,数据的格式取决于使用哪个方法来启动读取操作。

还有几个事件处理函数:

  • FileReader.onabort:处理 abort 事件。该事件在读取操作被中断时触发。
  • FileReader.onerror:处理 error 事件。该事件在读取操作发生错误时触发。
  • FileReader.onload:处理 load 事件。该事件在读取操作完成时触发。
  • FileReader.onloadstart:处理 loadstart 事件。该事件在读取操作开始时触发。
  • FileReader.onloadend:处理 loadend 事件。该事件在读取操作结束时(要么成功,要么失败)触发。
  • FileReader.onprogress:处理 progress 事件。该事件在读取 Blob 时触发。

可以用的方法如下:

  • FileReader.abort():中止读取操作。在返回时,readyState 属性为 DONE
  • FileReader.readAsArrayBuffer():开始读取指定的 Blob 中的内容。一旦完成,result 属性将包含一个ArrayBuffer 来表示文件数据;
  • FileReader.readAsBinaryString():开始读取指定的 Blob 中的内容。一旦完成,result 属性中将包含所读取文件的原始二进制数据。
  • FileReader.readAsDataURL():开始读取指定的 Blob 中的内容。一旦完成,result 属性中将包含一个 data: URL 格式的字符串以表示所读取文件的内容。
  • FileReader.readAsText():开始读取指定的 Blob 中的内容。一旦完成,result 属性中将包含一个字符串以表示所读取的文件内容。

上面的文档描述的很清楚了,但是估计你也没逐条细看,没关系,我们还有示例🙈

具体的应用场景可能如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
onDrop(files) {
        
files.forEach(file => {
const reader = new FileReader();
rea
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值