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

news2024/11/24 20:37:11

目录

第一章 了解

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)
    })
}

第三章 总结 

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

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

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

相关文章

基于OpenVidu的视频会议解决方案

OpenVidu是什么 OpenVidu 是一个开源的实时音视频通信平台&#xff0c;基于 Apache 2.0 协议开源的 WebRTC 视频会议平台&#xff0c;源码仓库地址&#xff1a;https://github.com/OpenVidu/openvidu。它提供了一组 API 和 SDK &#xff0c;使开发人员能够轻松地在 Web 和移动…

山区老人爱的礼物丨走进武隆区土地乡为山区老人送温暖

从车水马龙的城市到人烟稀少的乡村&#xff0c;穿越重峦叠嶂的高山&#xff0c;见到的是独属于大山的辽阔和山区老人眼中的星河。近日&#xff0c;传益千里为爱出发&#xff0c;在三棵柚公益基金会的支持下开展“山区老人爱的礼物”公益计划&#xff0c;走进武隆区土地乡&#…

GeoTrust SSL证书:您的网络信任卫士

在如今的数字化时代&#xff0c;我们的网络交易如脉搏般不断跳动&#xff0c;在这个过程中&#xff0c;安全保障尤其重要。于是像GeoTrust这样的品牌应运而生&#xff0c;它向我们承诺一件事情&#xff1a;无论在什么时候&#xff0c;我们的数据和交易都能得到最强的保护。下面…

Spring IOC—基于注解配置和管理Bean 万字详解(通俗易懂)

目录 一、前言 二、基于注解配置Bean 1.基本介绍 : 2.应用实例 : 3.注意事项 : 三、手动实现Spring 注解配置机制 1.需求 : 2.思路 : 3.实现 : 3.1 自定义注解类 3.2 自定义配置类 3.3 自定义容器类 3.4 在测试类中进行测试 四、自动装配 0.总述 : 1.AutoWired自动装…

关于 Redis 与传统关系型数据库的选择

当需要为你的应用程序选择合适的数据库时&#xff0c;选择何种数据库通常取决于你项目的特定要求。Redis 是一种高性能的内存数据存储&#xff0c;而 MySQL 等传统关系型数据库也各自具有自己的优势和劣势。在本期文章中&#xff0c;我们将探讨在 Redis 和传统关系型数据库之间…

minio异常处理:S3 API Requests must be made to API port

1、创建minio服务时候需要映射出console端口和api端口&#xff0c;指定console端口和api端口 docker run -p 9000:9000 -p 9099:9099 --name minio -d --restartalways -e "MINIO_ACCESS_KEYadmin" -e "MINIO_SECRET_KEYMINIOE:<&G5*;dL?(fr" -v…

【✅如何针对大Excel做文件读取?】

✅如何针对大Excel做文件读取&#xff1f; &#x1f7e9;如何针对大Excel做文件读取&#x1f7e9;XSSFWorkbook文件读取&#x1f7e9;EasyExcel文件读取 ✅扩展知识&#x1f7e9; EasyExcel简介&#x1f7e9;EasyExcel 为什么内存占用小&#xff1f; &#x1f7e9;如何针对大Ex…

JavaScript中的一些惊艳的编程技巧

你见过哪些令你膛目结舌的代码技巧&#xff1f; 代码世界有很多令人大呼小叫的技巧&#xff01;有的代码像魔术师一样巧妙地隐藏了自己&#xff0c;有的像魔法师一样让你眼花缭乱&#xff0c;还有的像瑜伽大师一样灵活自如。它们让我们惊叹不已&#xff0c;让我们觉得自己仿佛…

检测当前目录,将文件名输出到excel文件并建立链接

EXCEL是一个非常使用的软件,虽然我们平时仅使用他做一些报表,仅此而已; 我在工作中,由于很懒,不愿意做考试重复的工作,就想着使用vba的宏来完成重复的工作,这样就能省出一部分的时间来了。 本人不喜欢在博客里面写以下教程类的东西,我的理念是将工作中的痛点的解决办法…

我记不住的那些vim操作2

背景&#xff1a;最近在重新学习vi/vim&#xff0c;发现这个编辑器的用法真是太灵活了&#xff0c;所能掌控的也太多了&#xff0c;这次学习了一些之前没有学习过的内容&#xff0c;之前都是移动鼠标、编辑、复制、粘贴、保存等等(点我查看)&#xff0c;本次将介绍 标签、区域、…

设计模式-单例设计模式详解

生命无罪&#xff0c;健康万岁&#xff0c;我是laity。 我曾七次鄙视自己的灵魂&#xff1a; 第一次&#xff0c;当它本可进取时&#xff0c;却故作谦卑&#xff1b; 第二次&#xff0c;当它在空虚时&#xff0c;用爱欲来填充&#xff1b; 第三次&#xff0c;在困难和容易之…

一文图解 Transformer,小白也看得懂(完整版)

原作者&#xff1a;Jay Alammar 原链接&#xff1a;https://jalammar.github.io/illustrated-transformer 1.导语 谷歌推出的BERT模型在11项NLP任务中夺得SOTA结果&#xff0c;引爆了整个NLP界。而BERT取得成功的一个关键因素是Transformer的强大作用。谷歌的Transformer模型最…

043.Python异常处理_自定义上下文管理器

我 的 个 人 主 页&#xff1a;&#x1f449;&#x1f449; 失心疯的个人主页 &#x1f448;&#x1f448; 入 门 教 程 推 荐 &#xff1a;&#x1f449;&#x1f449; Python零基础入门教程合集 &#x1f448;&#x1f448; 虚 拟 环 境 搭 建 &#xff1a;&#x1f449;&…

ESP32 核心闪存损坏

问题描述&#xff1a;使用Platform 开发ESP32-S3 报错通过串口打印报错提示为核心闪存损失具体报错如下。 ELF file SHA256: 25c739c3d81d8f15 E (183) esp_core_dump_flash: Core dump flash config is corrupted! CRC0x7bd5c66f instead of 0x0 Rebooting... ESP-ROM:esp32s3…

Python项目——表白照片墙

1、介绍 利用女神的照片&#xff0c;组成女神的名字&#xff0c;向女神表白。如下图&#xff1a; 原理&#xff1a;获取每个像素点的颜色&#xff0c;白色不贴图&#xff0c;黑色贴图。 2、工具 语言&#xff1a;python3.11编译器&#xff1a;PyCharm包&#xff1a;pygame p…

【IOS开发】传感器 SensorKit

资源 官方文档 https://developer.apple.com/search/?qmotion%20graph&typeDocumentation SensorKit 使应用程序能够访问选定的原始数据或系统从传感器处理的指标。 步骤信息加速度计或旋转速率数据用户手腕上手表的配置物理环境中的环境光有关用户日常通勤或旅行的详细…

java SpringCloud版本b2b2c鸿鹄云商平台全套解决方案

使用技术&#xff1a; Spring CloudSpring BootMybatis微服务服务监控可视化运营 B2B2C平台&#xff1a; 平台管理端(包含自营) 商家平台端(多商户入驻) PC买家端、手机wap/公众号买家端 微服务&#xff08;30个通用微服务如&#xff1a;商品、订单、购物车、个人中心、支…

项目实操四-性能测试过程实时监控分析

这里写目录标题 一、JMeter性能测试技巧1、CSV文件驱动2、定时器a、泊松随机定时器b、固定定时器c、高斯随机定时器d、均衡随机定时器e、同步定时器f、固定吞吐量定时器g、精准吞吐量定时器 3、全局变量 - 跨线程数据传递4、Debug调试器5、JMeter执行机端口被占用 二、JMeter性…

Linux集群实用脚本

现有三台虚拟机&#xff0c;例如&#xff1a;node2、node3、node4 三台虚拟机配置了免密登录&#xff0c;安装了hadoop等软件。 相关集群实用脚本命令 统一执行jps命令 jpsall #!/bin/bash ​ for host in node2 node3 node4 doecho $host ssh $host jps done ​ 统一执行命…

JVM日常故障排查小结

前置知识 jstack简介 jstack是JVM自带的工具&#xff0c;用于追踪Java进程线程id的堆栈信息、锁信息&#xff0c;或者打印core file&#xff0c;远程调试Java堆栈信息等。 而我们常用的指令则是下面这条: # 打印对应java进程的堆栈信息 jstack [ option ] pid option常见选…