js:浏览器环境下复制图片到剪切板

news2024/10/10 14:25:57

浏览器环境下复制图片到剪切板思路:

  1. 通过canvas将图片url转为base64格式
  2. 将base64格式转为Blob类型的数据
  3. 调用浏览器接口复制内容到剪切板

图片处理工具方法

image-util.js

// Image对象转base64
export function imageToBase64(image) {
  let canvas = document.createElement('canvas')

  canvas.width = image.width
  canvas.height = image.height

  let context = canvas.getContext('2d')
  context.drawImage(image, 0, 0, image.width, image.height)

  return canvas.toDataURL('image/png')
}

// 回调方式 Image url 转base64
export function urlToBase64(url, callback = null) {
  let image = new Image()

  image.setAttribute('crossOrigin', 'Anonymous')
  image.src = url

  image.onload = function () {
    let dataURL = imageToBase64(image)
    if (callback) {
      callback(dataURL)
    }
  }
}

// Promise方式 Image url 转base64
export function urlToBase64Async(url) {
  return new Promise((resolve, reject) => {
    urlToBase64(url, (data) => {
      resolve(data)
    })
  })
}

/**
 * 从base64编码中解析图片信息
 * @param {String} base64 
 * eg: data:image/gif;base64,R0lGODlhAQABAPcAAAuvCwu1Cwy6DAy/DA
 * 
 * @returns {Object}
 * eg: 
 * {
    type: 'image/gif',
    ext: 'gif',
    data: 'R0lGODlhAQABAPcAAAuvCwu1Cwy6DAy/DA'
 */
export function parseBase64(base64) {
  let re = new RegExp('data:(?<type>.*?);base64,(?<data>.*)')
  let res = re.exec(base64)

  if (res) {
    return {
      type: res.groups.type,
      ext: res.groups.type.split('/').slice(-1)[0],
      data: res.groups.data,
    }
  }
}

/**
 * 拷贝图片到剪切板
 * @param {*} imageUrl 
 */
export async function copyImageToClipboard(imageUrl) {
  const base64Url = await urlToBase64Async(imageUrl)

  const parsedBase64 = parseBase64(base64Url)

  let type = parsedBase64.type

  //将base64转为Blob类型
  let bytes = atob(parsedBase64.data)
  let ab = new ArrayBuffer(bytes.length)
  let ua = new Uint8Array(ab)

  for (let i = 0; i < bytes.length; i++) {
    ua[i] = bytes.charCodeAt(i)
  }

  let blob = new Blob([ab], { type })

  navigator.clipboard.write([new ClipboardItem({ [type]: blob })])
}

使用方式

copyImageToClipboard('https://cn.bing.com/th?id=OHR.TeaEstate_ZH-CN9645412630_1920x1080.webp')

示例

该示例实现了图片复制格式转换下载

在线示例:https://mouday.github.io/wallpaper/

在这里插入图片描述

参考文章

  • 原生js实现将base64图片内容复制到剪贴板
  • js:图片url转为png格式的base64编码
  • js: 从base64编码中解析图片信息

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

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

相关文章

Canal深入调研

Canal深入调研 1.canal的设计 1.1 Canal的设计理念 canal的组件化设计非常好&#xff0c;有点类似于tomcat的设计。使用组合设计&#xff0c;依赖倒置&#xff0c;面向接口的设计。 说明&#xff1a; ​ server代表一个canal运行实例&#xff0c;对应于一个jvm ​ instance…

免费分享一套基于SpringBoot实现商城系统(仿天猫),挺漂亮的

大家好&#xff0c;我是锋哥&#xff0c;看到一个不错的基于SpringBoot实现商城系统(仿天猫)系统&#xff0c;分享下哈。 项目介绍 迷你天猫商城是一个基于Spring Boot的综合性B2C电商平台&#xff0c;需求设计主要参考天猫商城的购物流程&#xff1a;用户从注册开始&#xf…

编码器原理

编码器原理 编码器是一种用来测量机械旋转或位移的传感器。这种传感器能够测量机械部件在旋转或直线运动时的位移位置或速度等信息,并将其转换成一系列电信号。 光栅式旋转编码器 霍尔式编码器

制作一个简易的计算器app

1、Ui开发 笔者的Ui制作的制作的比较麻烦仅供参考&#xff0c;在这里使用了多个LinearLayout对屏幕进行了划分。不建议大家这样做最好使用GridLayout会更加快捷简单 笔者大致划分是这样的&#xff1a; 使用了四个大框&#xff0c;在第四个大框里面有多个小框 最终界面如下&am…

Linux(一)

一.FinalShell远程连接Linux系统&#xff08;可能在自己电脑虚拟机上也可能在服务器上&#xff09; 二.掌握使用WSL获得Ubuntu系统环境 WSL作为Windows10系统带来的全新特性。 传统方式获取Linux操作系统环境&#xff0c;是安装完整的虚拟机&#xff0c;如VMware 使用WSL&#…

系统架构设计师 10:软件架构的演化和维护

一、软件架构演化 如果软件架构的定义是 SA{components, connectors, constraints}&#xff0c;也就是说&#xff0c;软件架构包括组件、连接件和约束三大要素&#xff0c;这类软件架构演化主要关注的就是组件、连接件和约束的添加、修改与删除等。 二、面向对象软件架构演化…

点云分割-pcl区域生长算法

目录 写在前面原理代码运行结果 参考完 写在前面 1、本文内容 pcl的区域生长算法的使用和原理 2、平台/环境 cmake, pcl 3、转载请注明出处&#xff1a; https://blog.csdn.net/qq_41102371/article/details/131927376 原理 参考&#xff1a;https://pcl.readthedocs.io/pr…

从风控系统看架构设计原型图分析

目录 一、对架构与架构图的理解 &#xff08;一&#xff09;架构的本质 &#xff08;二&#xff09;软件设计中架构域的划分 &#xff08;三&#xff09;架构图设计 架构图设计的必要性 如何画架构图 二、实践业务架构与产品架构设计 &#xff08;一&#xff09;列出问…

基于SpringBoot+vue的学生成绩管理系统设计与实现(源码+LW+部署文档等)

博主介绍&#xff1a; 大家好&#xff0c;我是一名在Java圈混迹十余年的程序员&#xff0c;精通Java编程语言&#xff0c;同时也熟练掌握微信小程序、Python和Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架…

重学C++系列之虚继承

一、什么是虚继承 虚继承是C中一种继承的机制。继承有普通继承和虚继承两种机制&#xff0c;默认是普通继承&#xff0c;如果要使用多继承&#xff0c;需要在继承方式里加上关键字virtual。 二、为什么要虚继承 在C中&#xff0c;为解决二义性问题&#xff0c;引入虚继承机制。…

tinkerCAD案例:9. Saw Shaped Wrench 锯形扳手

tinkerCAD案例&#xff1a;9. Saw Shaped Wrench 锯形扳手 ln this lesson you will learn how to create a cool saw shaped wrench. 在本课中&#xff0c;您将学习如何制作一个很酷的锯形扳手。 Start the lesson by dragging a polygon to the workplane. 通过将多边形拖动…

从模型坐标到屏幕坐标

在 3D 引擎中&#xff0c;场景通常被描述为三维空间中的模型或对象&#xff0c;每个模型对象由许多三维顶点组成。最终&#xff0c;这些模型对象将在平面屏幕上呈现和显示。 渲染场景始终相对于摄像机&#xff0c;因此&#xff0c;还必须相对于摄像机的视图定义场景的顶点。了…

zeppelin spark kerberos 使用过程遇到的问题

参考配置教程: Configure Zeppelin for a Kerberos-Enabled Cluster zeppelin spark kerberos 使用过程遇到的问题 ambari创建zeppelin时,会创建Kerberos account and keytab /etc/security/keytabs/zeppelin.server.kerberos.keytab interpreter配置 keytab Interpreter Ke…

新来个技术总监,禁止我们用Git的rebase!?

△Hollis, 一个对Coding有着独特追求的人△ 这是Hollis的第 429 篇原创分享 作者 l Hollis 来源 l Hollis&#xff08;ID&#xff1a;hollischuang&#xff09; 在Git中&#xff0c;merge和rebase是两种不同的代码合并策略&#xff0c;它们用于将一个分支的更改合并到另一个分支…

动态内存常见的问题

对空指针的解引用 改正后的代码&#xff1a; 返回栈&#xff08;临时变量&#xff09;空间地址的问题 释放空间后及时把指针设为空 void Test(void) {char* str (char*)malloc(100);strcpy(str, "hello");free(str);str NULL;//释放空间后及时把指针设为空if (s…

嵌入式学习入门和求职经验

入门阶段&#xff1a;&#xff08;不要只看书&#xff0c;要多动手&#xff0c;但千万不是直接动手&#xff0c;不去看书&#xff09; C语言&#xff1a;嵌入式编程大多用C语言、少量汇编&#xff0c;先学习C语言&#xff0c;汇编用到的时候再上网查询。教材&#xff1a;随便一…

unity调用c++dll时变量处理问题

在C中为了处理方便可以将有些局部变量变为全局变量。 以下面三个变量为例 如果还有新全局变量需要这其来赋值&#xff0c;就会有问题。 如下面的body1_ptr为了dll生成处理方便&#xff0c;变为全局变量后&#xff0c;这个指针变赋值就会有问题。 因为geometry_path这个只在调…

上分秘籍 :如何用大模型跨模态能力核查网络谣言?

也许&#xff0c;你也曾听说过&#xff1a;&#x1f449;眼见未必为实&#x1f449;假新闻可比真新闻好传太多啦&#xff01;&#x1f449;谣言一张嘴&#xff0c;辟谣跑断腿大模型时代来临&#xff0c;除了肝&#xff0c;对付网络谣言&#xff0c;是不是有了新出路&#xff1f…

Java_23_并发包

并发包 并发包的来历&#xff1a; 在实际开发中如果不需要考虑线程安全问题&#xff0c;大家不需要做线程安全&#xff0c;因为如果做了反而性能不好&#xff01; 但是开发中有很多业务是需要考虑线程安全问题的&#xff0c;此时就必须考虑了。否则业务出现问题。 Java为很多业…

考公笔记题

一、考公报名网址 国家公务员局&#xff1a;国家公务员局 二、历年题库 华图在线&#xff1a;国省考公务员题库_公职教育类在线题库-华图在线 公务员&#xff1a;《行测》与《申论》 重点学习&#xff1a; 判断推理&#xff08;图形推理、定义判断&#xff08;影响不大&am…