当前位置: 首页 > 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);};};}
}


http://www.mrgr.cn/news/64135.html

相关文章:

  • 本地Push Git失败
  • pip安装
  • 【代码随想录day58】【C++复健】 117. 软件构建(拓扑排序);47. 参加科学大会(dijkstra(朴素版)精讲)
  • mEssentials Handwritten — Motionvfx 75个复古潦草手写涂鸦风格文字标题动画排版效果转场FCPX插件
  • Excel批量设置行高,Excel表格设置自动换行后打印显示不全,Excel表格设置最合适的行高后打印显示不全,完美解决方案!!!
  • uniapp小程序实现弹幕不重叠
  • yarn install 出现 error Error: certificate has expired
  • AWS RDS Oracle hit ORA-39405
  • 基于SSM的游戏交易网站的设计与实现
  • 一个指针可以被声明为 `volatile`
  • 力扣每日一题2024/11/2 3226. 使两个整数相等的位更改次数
  • 【棋盘覆盖——匈牙利算法】
  • 课程讲解---深搜
  • 使用NCNN在树莓派部署深度学习模型流程
  • vue中向响应式对象中添加新属性的方法(vm.$set() )
  • 微服务设计模式 - 发布订阅模式(Publisher Subscriber Pattern)
  • JavaScript。—关于语法基础的理解—
  • nacos+maven实现多环境配置
  • 广义加性模型
  • 短剧开发新模式:从内容创新到市场突围的全攻略
  • 仅需百元/年,助你快速构建高效私有的Node.js图床
  • Yocto中MACHINE 和 DISTRO是输入,IMAGE 是他们组合的产物
  • 华为云安装docker
  • Docker — 跨平台和环境部署
  • Linux:防火墙和selinux对服务的影响
  • docker复现pytorch_cyclegan