分享!!!(一)小编总结的base64、blob、图片文件二进制相互转换的方式以及源码

目录

第一章 了解

1.1 大概结构

1.2 准备阶段

1.2.1 了解canvas

1.2.2 了解imageData

1.2.3 了解imgUrl

1.2.4 了解base64

1.2.5 了解blob/文件二进制流

1.2.6 了解arraybuffer

1.2.7 文件、图片

第二章 掌握图中的相互转换

2.1 cavas 与 imageData的互相转换

2.1.1 canvas 转 imageData

2.1.2  image 转 canvas

2.2 imgUrl 转 canvas

2.3 canvas 转 base64

2.4 canvas 转 blob

2.5 blob 转 临时url(常用)

2.6 base64、blob转的临时url 赋值 url (常用) 

2.7 base64 与 blob的互相转换(常用)

2.7.1 base64 转 blob

2.7.2 blob 转 base64

2.8 arraybuffer 转 base64(常用)

2.9 arraybuffer 转 blob(常用)

第三章 总结 

第一章 了解

1.1 大概结构

1.2 准备阶段

1.2.1 了解canvas

  • <canvas> 标签用于绘制图像,但是该元素本身是没有绘图能力的,他只是一个绘制图形的容器,要实现在该标签上绘制东西,需要通过getContext() 方法返回的一个对象,该对象提供了用于在画布上绘图的方法和属性,从而绘制图形在cavas画布上。

详细api可看该官网:HTML 画布 | 菜鸟教程

1.2.2 了解imageData

  • imageData是通过canva方法最终获取到是图像 ImageData 数据对象,该data中包括了图像的数据、宽高等

1.2.3 了解imgUrl

  • 对于前端来说最熟悉的莫过于它了,其实就是需要渲染的图片路径能放在img/image图片的src属性上回显;本地、临时、base64都可以赋值,然后通过标签渲染成图片

1.2.4 了解base64

  • (格式:data:image/jpg;base64,具体的编码值)这也是渲染图片的一种方式,如果图片像loading或者小图标,小图片这样的,大小极小,但又占据了一次HTTP请求,而很多地方都会使用,可以使用base64的url图片技术进行优化

1.2.5 了解blob/文件二进制流

  • 二进制大对象,是一个可以存储二进制文件的容器;当后端返回特定的图片二进制流的时候,前端用blob容器接收二进制流(这里的方法使用基本上都是固定的,大差不差),并对其进行处理;而前端要想传blob/文件二进制流给后端,常用的方法就是利用FormData对象(说远了,后续小编会涉及到该传参的文章)

1.2.6 了解arraybuffer

  • 与bolb/文件二进制流类似,arraybuffer也是二进制数据对象

1.2.7 文件、图片

  • 很明显了,我们在前端执行上传的时候本地的图片、Excel文件、pdf、压缩包等待

第二章 掌握图中的相互转换

2.1 cavas 与 imageData的互相转换

2.1.1 canvas 转 imageData

  • canvas.getContext("2d").getImageData(x,y,width,height):该方法是复制画布上指定矩形的像素数据,x,y表示起点坐标(左上角),width,height表示要复制画布内容的宽高;这些画布的属性组合就是imageDatad对象。

2.1.2  image 转 canvas

  • canvas.getContext("2d").putImageData(imageData,x,y):该方法是将图像数据放回画布,与方法一刚好互斥,imageData是指图像的数据对象,x,y表示图像放置的位置(左上角)

2.2 imgUrl 转 canvas

  • canvas.getContext("2d").drawImage(img,x,y):在画布上定位图像,img为图像标签对象(可以通过类、id等获取),x,y图片放置的位置(左上角)
  • canvas.getContext("2d").drawImage(img,x,y,width,height):在上面的基础上规定图像的宽度和高度,width,height为图像的宽高
  • canvas.getContext("2d").drawImage(img,sx,sy,swidth,sheight,x,y,width,height):剪切图像,并将剪切的图像放到画布上,sx,sy为剪切的起始位置,swidth,sheight剪切的宽高

2.3 canvas 转 base64

  • canvas.toDataURL(type, encoderOptions):type为图片格式,默认为 image/png,也可以是其他 image/jpeg…;encoderOptions为图片的质量,默认0.92,取值0-1,返回是一个数据url,是base64组成的,可以直接赋值给img/image图片标签的src属性上
  • 用法:
const base64Data = canvas.toDataURL('image/jpeg', 1.0)
console.log('base64Data', base64Data)

 

2.4 canvas 转 blob

  • canvas.toBlob(callback, type, encoderOptions):该方法为创造Blob对象,callback: 参数是blob对象的回调函数,type默认图片类型是image/png,分辨率是0.96
canvas.toBlob(function (blob) {
    console.log('to blob');
    console.log(blob);
},"image/jpeg",0.1)

2.5 blob 转 临时url(常用)

  •  window.URL.createObjectURL(blob || file) 该方法传入的是blob二进制流对象或者file二进制流对象,从而创建了一个临时的url路径
  • new Blob( array, options ) :返回一个blob对象,array 为一个数组可以是 ArrayBuffer ,ArrayBufferView, Blob,DOMString 等对象构成的 Array ,options是一个对象,常用的type键值对是为了指定类型
import deathCertificateService from '@/api/funeral/certificate/deathCertificateService.js'

deathCertificateService
    .downloadImage({ fileName })
    .then(({ data }) => {
        // 注意该data由于请求已经配置了responseType: 'blob',前端得到的data已经是一个blob二进制流对象了,
        // 所以获取临时路径的该方法不需要再对参数做别处理操作,直接用即可
        console.log('data', data)
        const blobObj = data
        // window.URL.createObjectURL 将blob二进制流转为一个临时的url 
        const url = window.URL.createObjectURL(blobObj)
        console.log('临时url', url)
        this.certFile = url
    })
  • 与后端商量好需要什么,前端要限制响应类型 

2.6 base64、blob转的临时url 赋值 url (常用) 

 

2.7 base64 与 blob的互相转换(常用)

调用函数的完整代码块

async doSubmitImage () {
    // 获取标签元素
    const ele = document.getElementById('container')
    // 调用将该标签的内容先转换为canvas,然后转换成base64的函数
    // 小编这里已经使用了html2canvas插件,它会将我们传的html标签内容先放到canvas上
    const base64 = await common.imgToBase64(ele)
    // 输出base64
    console.log('base64', base64)
    // 调用将base64转换为blob二进制流的函数
    const blob = common.base64ToBlob(base64)
    // 输出blob
    console.log('blob', blob)
    // 调用将blob转换为base64的函数
    common.blobToBase64(blob, (dataurl) => {
        console.log('tobase64', dataurl)
    })
}

2.7.1 base64 转 blob

  • atob(baseStr):全称就是ASCII-to-Binary,用于Base64解码,参数为一个Base64表示的字符串(注意不包括前缀data:image/jpeg;base64,),返回值为一个正常的字符串

  • btoa(str):全称就是Binary-to-ASCII,用于Base64编码,参数为一个正常的字符串,返回值为一个Base64 表示的字符串
  • new ArrayBuffer(length):用于表示通用的固定长度原始二进制数据(解码后的)缓冲区,参数length是要创建的数组缓冲区的大小(以字节为单位),返回一个指定大小的新对象
base64toBlob (urlData) {
    // 定义blob的类型
    const type = 'image/png'
    let bytes = null
    // 该判断是对urlData参数是完整的base64还是没有前缀的
    if (urlData.split(',').length > 1) {
      bytes = window.atob(urlData.split(',')[1])
    } else {
      bytes = window.atob(urlData)
    }
    // 创建一个指定大小的ArrayBuffer新对象,利用new Blob转为blob二进制流
    let ab = new ArrayBuffer(bytes.length)
    console.log('ab', ab)
    // -----该段代码未用到-----
    let ia = new Uint8Array(ab)
    for (let i = 0; i < bytes.length; i++) {
      ia[i] = bytes.charCodeAt(i)
    }
    // -----该段代码未用到-----
    return new Blob([ab], { type })
}
  • (对 new ArrayBuffer()、new Uint8Array()等系列研究后续小编学习后会系统再出文章)

// 工具文件导入
import common from '@/utils/common'

console.log('base64', base64)
// 函数调用
const bolb = common.base64ToBlob(base64)
console.log('blob', bolb)

2.7.2 blob 转 base64

blobToBase64 (blob, callback) {
    const fileReader = new FileReader()
    fileReader.onload = (e) => {
      callback(e.target.result)
    }
    fileReader.readAsDataURL(blob)
}
console.log('blob', blob)
common.blobToBase64(blob, (dataurl) => {
    console.log('tobase64', dataurl)
})

2.8 arraybuffer 转 base64(常用)

  • 注意:该转换未总结出通用的方法,当前只用于uniapp项目
  •  new Uint8Array方法:8为无符号整型的转换,将ArrayBuffer(缓冲区)转换为TypedArray(缓冲区视图)
  • uni.arrayBufferToBase64:该方法是将 ArrayBuffer 对象转成 Base64 字符串(往深点说应该是ArrayBuffer 转换的视图对象转成 Base64 字符串)

imgRequest(options){
    return new Promise((resolve, reject) => {
        uni.request({
            sslVerify:false,
            url: uni.$configs.baseUrl + options.url, //路径
            method: options.method || 'GET', //默认get请求
            data: options.data || {}, //有参数或默认空对象
            header: options.headers,
            responseType: 'arraybuffer',
            success: (res) => {
                // 这里的res.data是返回的一个arraybuffer原始数据的缓冲区,我们直接操作不了的
                console.log('data', res.data)
                const arrayBuffer = new Uint8Array(res.data)
                // 利用方法转换为base64
                const base64 = "data:image/png;base64,"+uni.arrayBufferToBase64(arrayBuffer)
                res.data = base64
                resolve(res) //抛出结果
            },
            fail: (err) => {
                reject(err,'请求错误')
            },
            // 完成之后关闭加载效果
            complete: () => {
            }
        })
    })
}

 实例:

uniapp:解决图形验证码问题及利用arraybuffer二进制转base64格式图片(后端传的图片数据形式:x00\x10JFIF\x00\x01\x02\x00…)_uniapp二进制文件转换图片-CSDN博客

2.9 arraybuffer 转 blob(常用)

  • 看懂前面的内容这部分就不用再细说了如何转的blob二进制流了
downloadInfo (file) {
    deathCertificateService.downloadImage({fileName: file}).then(({data}) => {
        // 注意设置的响应类型
        console.log('data', data)
        let arraybuffer = data
        const binaryData = []
        binaryData.push(arraybuffer)
        // 这段代码就是转为bolb二进制流对象
        console.log('arr->blob', new Blob(binaryData, { type: 'image/jpeg' }))
        // 这里是直接转为临时路径
        const url = window.URL.createObjectURL(new Blob(binaryData, { type: 'image/jpeg' }))
        // window.open(url)
    })
}

第三章 总结 

仔细琢磨小编的这个图的结构,基本上前端各个相关图片文件的正常正常转换都能实现一定一定注意的是下图转换是能跟着箭头多步完成的,不要局限一步完成,下面红框框的模块,小编后续学习中会继续细分出来,如果大家有思路,欢迎评论区留言!!!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Java】基于fabric8io库操作k8s集群实战(pod、deployment、service、volume)

目录 前言一、基于fabric8io操作pod1.1 yaml创建pod1.2 fabric8io创建pod案例 二、基于fabric8io创建Service&#xff08;含Deployment&#xff09;2.1 yaml创建Service和Deployment2.2 fabric8io创建service案例 三、基于fabric8io操作Volume3.1 yaml配置挂载存储卷3.2 基于fa…

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)控件的部分公共属性和事件

鸿蒙&#xff08;HarmonyOS&#xff09;项目方舟框架&#xff08;ArkUI&#xff09;控件的部分公共属性和事件 一、操作环境 操作系统: Windows 10 专业版 IDE:DevEco Studio 3.1 SDK:HarmonyOS 3.1 二、公共属性 常用的公共属性有&#xff1a; 宽(with)、高(height)、…

Python Pandas 如何增加/插入一列数据(第5讲)

Python Pandas 如何增加/插入一列数据(第5讲)         🍹博主 侯小啾 感谢您的支持与信赖。☀️ 🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹…

17.Oracle中instr()函数查询字符位置

1、instr()函数的格式 &#xff08;俗称&#xff1a;字符查找函数&#xff09; 格式一&#xff1a;instr( string1, string2 ) // instr(源字符串, 目标字符串) 格式二&#xff1a;instr( string1, string2 [, start_position [, nth_appearance ] ] ) // instr(源字符…

docker-harbor 私有仓库

docker三大组件&#xff1a;镜像、容器、仓库 仓库&#xff1a;保存镜像 私有&#xff0c;自定义用户的形式登陆仓库&#xff0c;拉取或者上传镜像&#xff08;内部管理的用户&#xff09; harbor是VMware公司开发的开源的企业级的docker registry项目 帮助用户快速的搭建一…

mov格式怎么转换成mp4

在现代数字化时代&#xff0c;视频成为人们交流、娱乐和记录生活的重要工具。然而&#xff0c;不同的视频格式可能会给我们的使用带来一些不便。其中&#xff0c;MOV格式是一种常见的视频格式&#xff0c;而MP4格式则更加广泛兼容于不同的设备和平台。 一般来说&#xff0c;MP…

22款奔驰GLE450升级小柏林音响 提升音质效果

开车是一种很枯燥的事&#xff0c;特别是在拥堵路段很容易让人变得很烦躁&#xff0c;在我们平常生活中汽车陪伴我们的时间是非常久的&#xff0c;在网上经常看到很多人把车比作老婆&#xff0c;为了让自己的“老婆”内在更加美&#xff0c;很多车友对音乐尤为热衷&#xff0c;…

CesiumLab地理信息基础数据处理平台 各类数据类型介绍、发布数据介绍

目录 0 引言1 CesiumLab2 数据处理模块2.1 输出格式&#xff1a;切片文件格式2.2 输入格式2.2.1 传统GIS数据2.2.2 人工模型2.2.3 BIM模型2.2.4 倾斜实景数据2.2.5 点云数据 3 发布服务功能3.1 拓展&#xff1a;其他平台发布服务功能 &#x1f64b;‍♂️ 作者&#xff1a;海码…

2022最新云存储网盘系统,文件分享系统与文件存储系统。

资源入口 2022 最新云存储网盘系统, 文件分享系统与文件存储系统。 测试环境&#xff1a;Apache MySQL5.6 PHP7.0 安装 PHP 扩展 exif、fileinfo 从 PHP 禁用函数中 删除 shell_exec、proc_open、putenv 这三个 PHP 函数 PS&#xff1a;整体还不错的系统&#xff0c;注意的…

nodejs配置express服务器,运行自动打开浏览器

查看专栏目录 Network 灰鸽宝典专栏主要关注服务器的配置&#xff0c;前后端开发环境的配置&#xff0c;编辑器的配置&#xff0c;网络服务的配置&#xff0c;网络命令的应用与配置&#xff0c;windows常见问题的解决等。 文章目录 设置方法&#xff1a;1&#xff0c;安装nodej…

跟随山海鲸开发者,深入了解智慧城市解决方案的核心技术

随着科技的飞速发展&#xff0c;数字孪生技术逐渐成为智慧城市建设的重要手段。作为山海鲸开发者&#xff0c;我们深知数字孪生技术在智慧城市中的应用价值&#xff0c;因此致力于开发出高效、便捷的数字孪生智慧城市解决方案。因此本文将带大家了解山海鲸智慧城市解决方案。 …

Django 构建动态前端页面详解

概要 Django 是一个强大的 Python Web 框架&#xff0c;广泛用于后端开发。然而&#xff0c;它也支持直接使用 HTML, CSS, 和 JavaScript 来构建动态的前端界面。本文将详细介绍如何在 Django 项目中使用这些技术&#xff0c;包括设置静态文件、编写 HTML 模板以及集成 JavaSc…

YOLOv5改进 | SPPF | 将RT-DETR模型AIFI模块和Conv模块结合替换SPPF(全网独家改进)

一、本文介绍 本文给大家带来是用最新的RT-DETR模型中的AIFI模块来替换YOLOv5中的SPPF。RT-DETR号称是打败YOLO的检测模型&#xff0c;其作为一种基于Transformer的检测方法&#xff0c;相较于传统的基于卷积的检测方法&#xff0c;提供了更为全面和深入的特征理解&#xff0c…

Linux性能优化常做的一些事情

Linux性能优化是一个广泛的主题&#xff0c;涉及多个方面。以下是一些常见的Linux性能优化建议&#xff1a; 硬件和系统配置&#xff1a; 使用SSD替代HDD。确保系统有足够的RAM。使用多核CPU。配置合适的网络硬件和带宽。 磁盘I/O性能&#xff1a; 使用RAID来提高I/O性能。使用…

人工智能在金融与商业领域的智能化变革

导言 随着人工智能技术的不断发展&#xff0c;金融和商业领域正迎来一场智能化的变革。随着人工智能的不断发展&#xff0c;其在金融和商业领域的应用正成为业界瞩目的焦点。本文将深入探讨人工智能在金融和商业应用中的关键技术、应用场景以及对未来的影响。 1. 关键技术与算…

08-工厂方法

意图 定义一个用于创建对象的接口&#xff0c;让子类决定实例化哪一个类 类图 适用性 在下列情况可以使用工厂方法模式&#xff1a; 当一个类不知道它所必须创建的对象的类的时候。当一个类希望由它的子类来指定它所创建的对象的时候。当类将创建对象的职责委托给多个帮助子…

Axure的元件库的使用以及详细案例

目录 元件库的使用 元件介绍 元件的基本使用 矩形、按钮、标题的使用​编辑 图片的使用 图片以及热区的使用 表单元件的使用 表格元件的使用 登录界面 个人简介界面 元件库的使用 元件介绍 Axure提供了一套丰富的元件库&#xff0c;用于快速创建原型中常见的UI界面元素…

虚拟机性能监控、故障处理工具

虚拟机性能监控、故障处理工具 二、基础故障处理工具4.2.1 jps&#xff1a;虚拟机进程状况工具4.2.2 jstat:虚拟机统计信息监视工具4.2.3 jinfo:Java配置信息工具4.2.4 jmap:java内存映像工具4.2.5 jhat:虚拟机堆转储快照分析工具4.2.6 jstack&#xff1a;Java堆栈跟踪工具4.2.…

neo4j安装报错:neo4j.bat : 无法将“neo4j.bat”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。

neo4j安装报错&#xff1a; neo4j.bat : 无法将“neo4j.bat”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写&#xff0c;如果包括路径&#xff0c;请确 保路径正确&#xff0c;然后再试一次。 解决办法&#xff1a; 在环境变量中的&#xff0c;用户…

2023年全球运维大会(GOPS深圳站)-核心PPT资料下载

一、峰会简介 1、大会背景与概述 全球运维大会&#xff08;GOPS&#xff09;是运维领域最具影响力的国际盛会&#xff0c;每年都会汇聚世界各地的运维专家、企业领袖、技术爱好者&#xff0c;共同探讨运维技术的最新发展、最佳实践以及面临的挑战。2023年GOPS深圳站作为该系列…