当前位置: 首页 > news >正文

前端用canvas绘图并支持下载

1.根据数据绘制饼图

/** 绘制环形图 */
const drawPieCharts = () => {const {canWithdrawalPriceFront,noWithdrawalPriceFront,haveWithdrawalPriceFront,} = this.state;const myCanvas = this.cavasRef.current;// @ts-ignoreconst ctx = myCanvas.getContext('2d');if (ctx) {//数据const data = [canWithdrawalPriceFront,noWithdrawalPriceFront,haveWithdrawalPriceFront,];/* 需要把数据转出弧度 先计算总数*/let total = 0;data.forEach((item) => {// @ts-ignoretotal += item;});if (total === 0) {return;}//计算每个数据所占的弧度const angleList: any = [];data.forEach((item) => {if (item !== 0) {// @ts-ignoreconst angle = Math.PI * 2 * (item / total);angleList.push(angle);} else {angleList.push(0);}});/* 颜色 */const colorArr = ['#5FE6E6', '#FFB356', '#69BAF8'];/** 圆心坐标 */const centerWidth = ctx.canvas.width / 2;const centerHeight = ctx.canvas.height / 2;/** 起始位置 */let startAngle = 0;// 根据弧度绘制扇形// @ts-ignoreangleList.forEach((item, index) => {// 上一次绘制的结束弧度等于当前次的起始弧度const endAngle = startAngle + item;ctx.beginPath();ctx.moveTo(centerWidth, centerHeight);ctx.arc(centerWidth, centerHeight, 120, startAngle, endAngle);ctx.fillStyle = colorArr[index];ctx.fill();// 记录当前的结束位置作为下一次的起始位置startAngle = endAngle;});}
}

2.绘制两张图片并下载


const downloadImg = (item: ICanvasProp) => {const {posterItemWidth,posterItemHeight,posterBgWidth,posterBgHeight,codeX,codeY,posterCodeBgWidth,posterCodeBgHeight,} = item;// 用canvas绘图,然后再下载const imgName = moment().format('YYYY-MM-DD HH:mm:SS');const canvas = document.createElement('canvas');const ctx = canvas.getContext('2d');canvas.width = posterItemWidth;canvas.height = posterItemHeight;if (ctx) {ctx.rect(0, 0, posterItemWidth, posterItemHeight);const bgImg = new Image();// 解决缓存导致跨域问题bgImg.src = item.bgImgUrl + `?tamp=${new Date().getTime()}`;bgImg.setAttribute('crossOrigin', 'anonymous');bgImg.onload = () => {ctx.drawImage(bgImg, 0, 0, posterBgWidth, posterBgHeight);const codeImg = new Image();// 解决缓存导致跨域问题codeImg.src = item.codeImgUrl + `?tamp=${new Date().getTime()}`;codeImg.setAttribute('crossOrigin', 'anonymous');codeImg.onload = () => {ctx.drawImage(codeImg, codeX, codeY, posterCodeBgWidth, posterCodeBgHeight);const link = document.createElement('a');link.setAttribute('download', `图片-${imgName}.png`);link.setAttribute('href', canvas.toDataURL('image/png'));link.style.display = 'none';document.body.appendChild(link);link.click();document.body.removeChild(link);};};}
}

相关文章:

前端用canvas绘图并支持下载

1.根据数据绘制饼图 /** 绘制环形图 */ const drawPieCharts () > {const {canWithdrawalPriceFront,noWithdrawalPriceFront,haveWithdrawalPriceFront,} this.state;const myCanvas this.cavasRef.current;// ts-ignoreconst ctx myCanvas.getContext(2d);if (ctx) {…...

【Mac】Homebrew

1、Homebrew 简介 官网地址:https://brew.sh Homebrew 是一款Mac OS平台下的软件包管理工具,拥有安装、卸载、更新、查看、搜索等很多实用的功能。 Homebrew 主要有四个部分组成: brew、homebrew-core 、homebrew-bottles、homebrew-cask。 源说明br…...

Python笔记之线程库threading

Python笔记之线程库threading 参考博文 Python多线程笔记——简单函数版和类实现版 code review! Python 的 threading 库用于在程序中创建和管理线程。线程允许程序并发执行多个任务。以下是 threading 库的详解和一些简洁示例。 基本概念 线程:在一个进程中&a…...

go 包管理

Go语言所依赖的所有的第三方库都放在GOPATH目录下面 gomodule是Go语言默认的依赖管理工具 Modules是相关Go包的集合,是源代码交换和版本控制的单元,用于指定使用哪些源文件 GO111MODULEoff禁用gomodule,编译时从GOPATH和vendor文件夹中查找包…...

Js内建对象

数组解构 const arr ["1","2","3"]let a,b,c// 解构赋值 //将数组的第一个元素赋值给第一个变量,第二个元素赋值给第二个变量,依次类推[a,b,c] arr console.log(a,b,c) // 1 2 3 // 声明变量同时解构 let [a,b,c] [&qu…...

AXI接口的实现逻辑和底层原理,在FPGA中如何实现AXI接口,一篇文章足以搞明白!!!

AXI(Advanced eXtensible Interface)接口是一个点对点的接口,用于连接高性能的片上系统(SoC)中的处理器、外围设备、内存和其他IP核。以下是对AXI接口的详细解析,包括FPGA实现的原理、逻辑、速度以及详细的…...

《GBDT 算法的原理推导》 11-12计算损失函数的负梯度 公式解析

本文是将文章《GBDT 算法的原理推导》中的公式单独拿出来做一个详细的解析,便于初学者更好的理解。 公式(11-12)是GBDT算法中非常关键的一步,它表示了如何通过计算损失函数的负梯度来指导下一棵树的生长。 公式(11-12)如下: r m i − [ ∂ …...

mysql设计

大家好,我是捡田螺的小男孩。 昨天一位粉丝,咨询了一个并发的问题~ 我提供了一个乐观锁兜底的方案,然后发现他们的表,都没有加version字段的,我想到,这不是表设计通用字段嘛。因此,本文跟大家聊聊&#xf…...

Android 斗鱼面经

Android 斗鱼面经 文章目录 Android 斗鱼面经一面二面 一面 先简单描述一下JVM JRE JDK的关系 :::info JVM(Java Virtual Machine) Java 虚拟机。它只认识 xxx.class 这种类型的文件,它能够将 class 文件中的字节码指令进行识别并调用操作…...

【机器学习】26. 聚类评估方法

聚类评估方法 1. Unsupervised Measure1.1. Method 1: measure cohesion and separationSilhouette coefficient Method 2:Correlation between two similarity matricesMethod 3:Visual Inspection of similarity matrix 2. Supervised measures3. 决定…...

linux 最多能创建多少个 TCP 连接?

linux 最大允许TCP连接数 约束一&#xff1a;服务器的端口范围约束二&#xff0c;服务器文件描述符限制约束三&#xff1a;系统线程约束四&#xff1a;系统内存总结 tcp连接四元组&#xff1a;源ip&#xff0c;源端口 <> 目标ip&#xff0c;目标端口 连续对同一个目标ip及…...

我为何要用wordpress搭建一个自己的独立博客

我在csdn有一个博客&#xff0c;这个博客是之前学习编程时建立的。 博客有哪些好处呢&#xff1f; 1&#xff0c;可以写自己的遇到的问题和如何解决的步骤 2&#xff0c;心得体会&#xff0c;经验&#xff0c;和踩坑 3&#xff0c;可以转载别人的好的技术知识 4&#xff0c;宝贵…...

Linux系统每日定时备份mysql数据

一、创建存储脚本的文件夹 创建文件夹&#xff0c;我的脚本放在/root/dbback/mysql mkdir ... cd /root/dbback/mysql 二、编写脚本 vi backup_mysql.sh 复制脚本内容 DB_USER"填写用户名" DB_PASSWORD"填写密码" DB_NAME"数据库名称" # …...

书生大模型第一关Linux基础知识

任务一&#xff1a;完成SSH连接与端口映射并运行hello_world.py 1.SSH及其端口映射 2.在VSCode中安装插件&#xff1a; 3.创建开发机 最后点击创建&#xff0c;然后可能需要等待一段较长的时间&#xff0c;大概需要5分钟左右&#xff0c;如果需要排队则更长时间 然后选择…...

机器学习之fetch_olivetti_faces人脸识别--基于Python实现

fetch_olivetti_faces 数据集下载 fetch_olivetti_faceshttps://github.com/jikechao/olivettifaces sklearn.datasets.fetch_olivetti_faces(*, data_homeNone, shuffleFalse, random_state0, download_if_missingTrue, return_X_yFalse, n_retries3, delay1.0)[source] L…...

【系统设计】深入理解HTTP缓存机制:从Read-Through缓存到HTTP缓存的交互流程

在现代Web开发中&#xff0c;缓存机制扮演着至关重要的角色。它不仅提升了用户体验&#xff0c;还极大地优化了资源的使用效率。在这篇博文中&#xff0c;我们将从“Read-Through”缓存的概念出发&#xff0c;深入探讨HTTP缓存的工作原理和交互流程&#xff0c;并详细描述max-a…...

FLINK单机版安装部署入门-1

文章目录 FLINK单机版安装部署高于1.9.3需要修改配置文件flink-conf.yaml(低于1.9.3可以跳过)linux启动集群windows下启动Flink实例运行(单机)还有一种方式是上传任务包运行examples\streamingjava: Compilation failed: internal java compiler error高版本启动脚本 FLINK单机…...

深度学习-学习率调整策略

在深度学习中&#xff0c;学习率调整策略&#xff08;Learning Rate Scheduling&#xff09;用于在训练过程中动态调整学习率&#xff0c;以实现更快的收敛和更好的模型性能。选择合适的学习率策略可以避免模型陷入局部最优、震荡不稳定等问题。下面介绍一些常见的学习率调整策…...

【学员提问bug】小程序在onUnload里面调接口,用来记录退出的时间, 但是接口调用还没成功, 页面就关闭了。如何让接口在onUnload关闭前调用成功?

这种问题比较通用&#xff0c;并不涉及到具体方法执行障碍&#xff0c;所以&#xff0c;解决起来也不麻烦。但是新手往往不知道如何做。 在小程序中&#xff0c;如果在 onUnload 中调用 API 记录页面退出时间&#xff0c;但因为页面关闭速度较快导致请求未完成&#xff0c;可以…...

【刷题13】链表专题

目录 一、两数相加二、两两交换链表的节点三、重排链表四、合并k个升序链表五、k个一组翻转链表 一、两数相加 题目&#xff1a; 思路&#xff1a; 注意整数是逆序存储的&#xff0c;结果要按照题目的要求用链表连接起来遍历l1的cur1&#xff0c;遍历l2的cur2&#xff0c;和…...

Adafruit IO物联网平台:从零构建环境监测与报警系统

1. 项目概述&#xff1a;为什么你需要一个像Adafruit IO这样的物联网平台&#xff1f;如果你玩过Arduino、树莓派或者任何单片机&#xff0c;肯定遇到过这样的场景&#xff1a;费了老大劲写代码让传感器读出数据&#xff0c;结果这些数据要么在串口监视器里一闪而过&#xff0c…...

从零到一:ESP8266-12F最小系统板MQTT固件烧录实战

1. 为什么选择ESP8266-12F最小系统板&#xff1f; 很多朋友刚开始接触物联网开发时&#xff0c;都会选择NodeMCU这样的开发板。确实&#xff0c;NodeMCU自带USB转串口芯片&#xff0c;插上电脑就能直接烧录程序&#xff0c;对新手特别友好。但当你真正想把项目做成产品时&#…...

【法学研究效率革命】:NotebookLM如何将文献综述时间压缩73%?(20年法律AI实践者亲测)

更多请点击&#xff1a; https://codechina.net 第一章&#xff1a;NotebookLM法学研究辅助 NotebookLM 是 Google 推出的基于用户自有文档构建的 AI 助手&#xff0c;其核心能力在于对上传文本进行深度语义理解与上下文感知问答。在法学研究场景中&#xff0c;它可高效处理判…...

别再乱放模型文件了!手把手教你用Simulink Project管理MBD项目(附目录结构最佳实践)

从混乱到秩序&#xff1a;Simulink Project工程化管理实战指南 在模型驱动开发&#xff08;MBD&#xff09;的世界里&#xff0c;一个整洁有序的项目结构就像建筑师的蓝图——它不仅是工作的基础&#xff0c;更是团队协作和长期维护的保障。许多工程师在初次接触Simulink时&…...

为什么92%的团队在2026年前仓促重构AI栈?——主流框架弃用预警、许可证变更清单与平滑迁移路线图

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;2026年AI工具栈搭建完整指南 构建面向生产环境的AI工具栈&#xff0c;需兼顾前沿性、稳定性与可扩展性。2026年主流实践已从单点模型调用转向模块化、可观测、可编排的智能工作流基础设施。以下为推荐技…...

从碎片到体系:如何用Obsidian Weread插件打造你的个人读书知识库

从碎片到体系&#xff1a;如何用Obsidian Weread插件打造你的个人读书知识库 【免费下载链接】obsidian-weread-plugin Obsidian Weread Plugin is a plugin to sync Weread(微信读书) hightlights and annotations into your Obsidian Vault. 项目地址: https://gitcode.com…...

在 Claude Code 中配置 Taotoken 以解决封号与 Token 不足问题

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 在 Claude Code 中配置 Taotoken 以解决封号与 Token 不足问题 对于依赖 Claude Code 进行编程辅助的开发者而言&#xff0c;服务中…...

Shell 相关基础入门,在 Ubuntu 与 CentOS Shell 中的语法差异总结(bash、dash、sh)

新建的test.sh文件&#xff0c;vim进去&#xff0c;每行开头都默认有一个~符号&#xff0c;是什么意思&#xff0c;而且在里面鼠标也失效了&#xff1f; 你问的这两个问题&#xff0c;恰好是初学者刚接触 vim 编辑器时最常遇到的两个困惑。它们完全正常&#xff0c;不是系统出错…...

告别混合写法!详解Nginx 1.25.1中独立的http2指令配置与性能影响

Nginx 1.25.1 HTTP/2配置革新&#xff1a;架构演进与性能实践指南 当Nginx 1.25.1的更新日志中出现"http2指令独立"这一行文字时&#xff0c;许多资深运维工程师的配置管理哲学正在被悄然改写。这不仅仅是语法糖的调整&#xff0c;而是反映了Web服务器架构设计从&quo…...

AI写专著全攻略:从选题到完稿,AI工具帮你快速完成20万字专著!

学术专著的严谨性必须依靠大量的数据和资料&#xff0c;但资料的搜集和数据的整合却是写作中最为繁琐且耗时的部分。研究人员需要全面地收集国内外的前沿文献&#xff0c;这不仅包括确认文献的权威性和相关性&#xff0c;还有追溯原始出处&#xff0c;避免二次引用时的错误&…...