获取剪切板的图片 - File - Base64 - Blob - url - Image,以及它们之间的各种相互转换

news/2025/2/7 2:55:01/文章来源:https://www.cnblogs.com/smileZAZ/p/18584897

🧑‍💻 写在开头

点赞 + 收藏 === 学会🤣🤣🤣

一、获取剪切板的图片(拿到 File 对象)

js粘贴事件paste简单解析及遇到的坑 - 云+社区 - 腾讯云 (tencent.com)

document.addEventListener('paste', function(event) {let items = event.clipboardData && event.clipboardData.items;let file: any = null;if (items && items.length) {// 检索剪切板itemsfor (var i = 0; i < items.length; i++) {if (items[i].type.indexOf('image') !== -1) {file = items[i].getAsFile();break;}}}fileByBase64(file, (base64) => {shotCallback(base64);});console.log('file', file);// 此时file就是剪切板中的图片文件
});

本来想直接获取这个对象的,然鹅这个 clipboardData 对象只存在于 ClipboardEvent 事件中,只能在事件(这里是 parse 事件)触发的时候才能拿到。

ClipboardEvent.clipboardData - Web API 接口参考 | MDN (mozilla.org)

题外话:可以直接用 navigator.clipboard 获取到剪切板内容(拿到 Blob 对象)

Navigator.clipboard - Web API 接口参考 | MDN (mozilla.org)

剪贴板操作 Clipboard API 教程 - 阮一峰的网络日志 (ruanyifeng.com)

const getClipboard = async () => {const clipboardItems = await navigator.clipboard.read();for (const clipboardItem of clipboardItems) {for (const type of clipboardItem.types) {const blob = await clipboardItem.getType(type);console.log(URL.createObjectURL(blob));}}
};

二、File 对象转 Base64(利用 FileReader)

const fileByBase64 = (file, callback) => {const reader = new FileReader();// 传入一个参数对象即可得到基于该参数对象的文本内容reader.readAsDataURL(file);reader.onload = function(e: any) {// target.result 该属性表示目标对象的 DataURLconsole.log(e.target.result);callback(e.target.result);};
};

题外话 canvas -> dataUrl(Base64)

才发现 Base64 是 DataUrl 的编码,可以理解为一种东西吧。

canvas 对象可以直接转变成 base64,有一个很常用的 api:

const dataURL = canvas.toDataURL();

三、Base64 转 Blob

const base64ByBlob = (base64, callback) => {let arr = base64.split(','),mime = arr[0].match(/:(.*?);/)[1],bstr = atob(arr[1]),n = bstr.length,u8arr = new Uint8Array(n);while (n--) {u8arr[n] = bstr.charCodeAt(n);}console.log(new Blob([u8arr], { type: mime }));callback(new Blob([u8arr], { type: mime }));
};

题外话:Blob -> Base64(利用 FileReader)

由于 File 是特殊类型的 Blob,所以跟 File -> Base64 是一样的。

function blobToDataURI(blob, callback) {var reader = new FileReader();reader.onload = function (e) {callback(e.target?.result);};reader.readAsDataURL(blob);
}

题外话:File <--> Blob

它俩可以用构造函数直接相互转换,没有中间商 Base64。不过 file -> blob 会丢失 filename。

const blob = new Blob([file], {type: file.type
}
const file = new File([blob], filename, {type: blob.type
});

四、blob 转 url、file 转 url

const url1 = window.URL.createObjectURL(blob);
const url2 = window.URL.createObjectURL(file);

这里的 file 会被当做 blob 对象来使用,毕竟 file 是特殊的 blob,所以输出结果都是:

blob:http://localhost:3000/1df14e9d-b9d3-43d5-87ff-2f7c0ae44a9d

这种由 blob:http:// 开头的路径。

题外话:url -> blob

const urlToBlob = () => {fetch(url).then((res) => res.blob()).then((blob) => console.log(blob));
};

五、url 变 Image

const img = new Image();
img.src = url;

综合应用:获取剪切板图片并转成 Base64,然后 Base64 转成 Blob,然后 Blob 转成 url,然后转成图片 append 到 body 上

document.addEventListener('paste', function(event) {let items = event.clipboardData && event.clipboardData.items;console.log('items', items);let file: any = null;if (items && items.length) {// 检索剪切板 itemsfor (var i = 0; i < items.length; i++) {if (items[i].type.indexOf('image') !== -1) {// 此时file就是剪切板中的图片文件file = items[i].getAsFile();break;}}}fileByBase64(file, base64 => {base64ByBlob(base64, (blob) => {const url = window.URL.createObjectURL(blob);console.log('url', url);const img = new Image();img.src = url;img.onload = () => {document.body.appendChild(img);};});});
});

如果不需要额外使用 Base64 的话,直接用 file 对象替代 blob 也是可以的,因为 file 只是特殊的 blob,大家都是二进制文件:

document.addEventListener('paste', function(event) {let items = event.clipboardData && event.clipboardData.items;console.log('items', items);let file: any = null;if (items && items.length) {// 检索剪切板 itemsfor (var i = 0; i < items.length; i++) {if (items[i].type.indexOf('image') !== -1) {// 此时file就是剪切板中的图片文件file = items[i].getAsFile();break;}}}const url = window.URL.createObjectURL(file);console.log('url', url);const img = new Image();img.src = url;img.onload = () => {document.body.appendChild(img);};
});

如果对您有所帮助,欢迎您点个关注,我会定时更新技术文档,大家一起讨论学习,一起进步。

 

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

k8s阶段05 Operator, DaemonSet, Job, CronJob, Ingress和Ingress Controller(蓝绿/恢复发布), helm

StatefulSet:编排有状态应用基本要求:需要给每个实例惟一且固定的标识,依赖于一个专用的Headless Service; 需要给每个实例一个专用的PVC卷,该卷要来自volumeTemplateClaim,卷的标识 “template_name-pod_name”;Pod Management Policy: OrderedReady:按顺序,依次Para…

单表增删改查

学习前,请先搞定数据库的驱动和连接,具体看黑马课程《java web》。 idea 先配置好Tomcat才可以进行,具体可以在CSDN上找教程 差旅费的简单单表增删改查 以下是数据库以下是控制台代码。 其中部分代码看不懂的话,可以在B站中《JAVA JDBC》中搞定 其中数据库的操作因人而异,…

JDBC连接数据库实现增删改查前端交互

实现交互最终要的是这个web.xml,其实我们新版本已经可以直接使用@这个CourseSevlet是前后端实现交互的映射,只有这个东西配置好了,才能实现前后端的交互,前端界面随便写写就行,主要就是那个意思

VScode中配置 C/C++ 环境

## VScode中配置 C/C++ 环境 1. 下载编译器MinGW并解压官网页面:https://www.mingw-w64.org/下载页面:https://sourceforge.net/projects/mingw-w64/files/下载页面中选择 x86_64-win32-seh 下载(目前已经更新,页面中没有,需要找很麻烦)MinGW直接下载地址 https://wwn.la…

hot100-一刷-04子串(共3道题)

560. 和为 K 的子数组 题目链接 题目描述代码实现 分析:暴力:还是有点技巧的,如果单纯暴力,外层fori循环遍历起始下标start,内层forj循环遍历末尾end,里面还需要个循环,计算从i加到j,最坏会到\(O(n^3)\)。考虑固定某一个边界,比如固定end,从end往前算。点击查看代码 c…

JDBC链接数据库

1.首先我们需要下载mysql的官网jar包 https://dev.mysql.com/downloads/connector/j/ 这个版本比较新 然后打开idea 创建一个项目 下面是链接代码,记得看注释 package com.stu.jdbc;//我的包的名字叫com.stu.jdbc,报错可以删除 import java.sql.*; public class JDBC {//这个…

欧拉路/欧拉回路 学习笔记【未完工】

欧拉路判定 有向图 首先这张图将所有的有向边转为无向边之后图连通。 反例: 其次,我们知道当且仅当所有点的入度和出度都相等,才会有欧拉回路。因为一个点进去之后一定会出来,所以入度一定等于出度。 同理,我们也可以知道入度和出度差 \(1\) 时,才会有欧拉路。因为不要从…

XPT8871模块的使用

该模块引脚如下所示:由于XPT8871为单声道功放,因此只能连接1个喇叭。需要注意的是电源不能反接,否则会让芯片直接烧毁。另外该模块有个问题就是电流声很大,即使是5W的喇叭仍能听见较大的电流声。 但是该模块的价格还是蛮便宜的,只要1-2块钱就可以了。

JWT规范及使用

JWT结构 JWT由三部分组成:Header Payload SignatureJWT通常如下所示: xxxxx.yyyyy.zzzzz JWT结构部分说明 Header 报头通常由两部分组成:TOKEN的类型,即JWT,以及所使用的签名算法,如HMAC SHA256或RSA。 例如: { "alg": "HS256", "typ": &…

习题9.4

点击查看代码 import numpy as np import pandas as pd import scipy.stats as ss import statsmodels.api as sm data = np.loadtxt(F:\python数学建模与算法\源程序\《Python数学建模算法与应用》程序和数据\第9章 数据的描述性统计方法/ti9_4.txt) x1 = np.tile(np.arange(…

习题9.5

点击查看代码 import numpy as np import statsmodels.api as sm data = np.loadtxt(F:\python数学建模与算法\源程序\《Python数学建模算法与应用》程序和数据\第9章 数据的描述性统计方法/ti9_5.txt) x1 = np.vstack([np.ones((4, 4)), np.ones((4, 4))*2, np.ones((4, 4))*…