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

Canvas绘制图片和区域

如何使用Canvas在图片上绘制区域?
一. 首先,我们需要初始化三个canvas画布(初始化Canvas)

 

initCanvas() {// 初始化canvas画布let canvasWrap = document.getElementsByClassName("canvas-wrap");this.wrapWidth = canvasWrap[0].clientWidth;this.wrapHeight = canvasWrap[0].clientHeight;this.imgCanvas = document.getElementById("imgCanvas");this.imgCtx = this.imgCanvas.getContext("2d");// 绘制canvasthis.drawCanvas = document.getElementById("drawCanvas");this.drawCtx = this.drawCanvas.getContext("2d");// 保存绘制区域 saveCanvasthis.saveCanvas = document.getElementById("saveCanvas");this.saveCtx = this.saveCanvas.getContext("2d");
}
  1. imgCanvas用于绘制原始图片
  2. drawCanvas用于临时绘制区域
  3. saveCanvas用于保存最终绘制的区域
二. 计算并设置canvas的宽高比例,以适应图片尺寸
initImgCanvas() {// 计算宽高比let ww = this.wrapWidth; // 画布宽度let wh = this.wrapHeight; // 画布高度 let iw = this.imgWidth; // 图片宽度let ih = this.imgHeight; // 图片高度if (iw / ih < ww / wh) {// 以高为主this.ratio = ih / wh;this.canvasHeight = wh;this.canvasWidth = (wh * iw) / ih;} else {// 以宽为主 this.ratio = iw / ww;this.canvasWidth = ww;this.canvasHeight = (ww * ih) / iw;}// 初始化画布大小this.imgCanvas.width = this.canvasWidth;this.imgCanvas.height = this.canvasHeight;this.drawCanvas.width = this.canvasWidth; this.drawCanvas.height = this.canvasHeight;this.saveCanvas.width = this.canvasWidth;this.saveCanvas.height = this.canvasHeight;// 图片加载绘制let img = document.createElement("img");img.src = this.imgUrl;img.onload = () => {console.log("图片已加载");this.imgCtx.drawImage(img, 0, 0, this.canvasWidth, this.canvasHeight);this.renderDatas(); // 渲染原有数据};
}

这里先计算画布和图片的宽高比,根据比例关系决定以宽为主还是以高为主进行等比缩放。然后设置三个canvas的宽高,并在图片加载完成后将其绘制到imgCanvas上。renderDatas函数用于渲染已有的绘制数据。

三. 绘制的主要逻辑 

startDraw() {// 绘制区域if (this.isDrawing) return;this.isDrawing = true;// 绘制逻辑this.drawCanvas.addEventListener("click", this.drawImageClickFn);this.drawCanvas.addEventListener("dblclick", this.drawImageDblClickFn);this.drawCanvas.addEventListener("mousemove", this.drawImageMoveFn);
}

http://www.lryc.cn/news/380890.html

相关文章:

  • Day10—Spark SQL基础
  • 开源技术:在线教育系统源码及教育培训APP开发指南
  • [C++][设计模式][观察者模式]详细讲解
  • Adobe Acrobat 编辑器软件下载安装,Acrobat 轻松编辑和管理各种PDF文件
  • eVTOL飞机:技术挑战、应用机遇和运动的作用
  • 【python】flask中如何向https服务器传输信息
  • 计算机网络 —— 应用层(FTP)
  • zookeeper + kafka消息队列
  • Python高级编程:深度学习基础
  • 如何从magento1迁移到magento2
  • 【Nginx】Nginx安装及简单使用
  • 【Linux系列】find命令使用与用法详解
  • Apple - DNS Service Discovery Programming Guide
  • 如何高效地为pip换源:详细操作指南
  • 免费ddns工具,快解析DNS解析使用教程
  • 【Vite】控制打包结构
  • Debian Linux安装minikubekubectl
  • Discuz动漫二次元风格网站模板
  • RIP、OSPF、IS-IS学习
  • 移植案例与原理 - build lite源码分析 之 hb命令__main__.py
  • Leo赠书活动-26期 不同数据库背后的数据存储方案
  • 在Windows10中使用Vim
  • 【Python机器学习实战】 | 基于PCA主成分分析技术读入空气质量监测数据进行数据预处理并计算空气质量综合评测结果
  • 学习java第一百零八天
  • Linux通配符总结
  • ffmpeg的安装教程
  • 禅道身份认证绕过漏洞(QVD-2024-15263)复现
  • 深入分析 Android BroadcastReceiver (六)
  • mysql 查询的一般思路
  • 【Web APIs】DOM 文档对象模型 ⑤ ( 获取特殊元素 | 获取 html 元素 | 获取 body 元素 )