news 2026/8/12 15:22:41

canvas绘制图片

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
canvas绘制图片

项目中有一个点击图片,在点击区域画圆标注的需求,需要知道点击的位置,并判断位置是否正确,类似“找不同”小游戏。这种就需要用到canvas了

基本说明

canvas是 一个 HTML 元素,用于绘制图形和图像,通过 JavaScript 来控制其行为。
<img>元素是用来在网页中显示图像的 HTML 元素。
drawImage()方法是Canvas 提供的一种方法,用于将图像、视频或另一个 canvas 的内容绘制到当前 canvas 上。

canvas 与 <img> 元素的结合,可以实现动态图像处理,包括但不限于图像裁剪、缩放、旋转等。

实现方法

最简单的方式是直接使用drawImage方法来绘制<img>元素的内容到 Canvas 上。需要注意的是,在使用drawImage之前,必须等待<img>元素加载完成。

<template> <div> <canvas id="myCanvas"></canvas> </div> </template> <script setup lang="ts"> import { onMounted } from "vue"; const draw = () => { // 创建 canvas 元素 const canvas:any = document.getElementById("myCanvas"); const ctx = canvas.getContext("2d", { willReadFrequently: true, }); // 创建 img 元素 const img = new Image(); img.src = '/src/assets/pro.png'; // 图片加载完成后绘制到 canvas img.onload = () => { canvas.width = img.width; canvas.height = img.height; ctx.drawImage(img, 0, 0, canvas.width, canvas.height); // 也可以省略后两个参数,默认画满 // ctx.drawImage(img, 0, 0); }; canvas.addEventListener("click", (e:any) => { const x = e.clientX; const y = e.clientY; console.log("点击的位置", x, y); // 点击的位置画出圆形 ctx.beginPath(); ctx.strokeStyle = "#0f0"; ctx.lineWidth = 5; ctx.arc(x, y - 50, 50, 0, 360); ctx.stroke(); }) } onMounted(() => { draw() }); </script>

效果如图:

注意:

  • img.src会把图片路径加载为绝对路径
  • 如果直接使用相对路径的话,会找不到图片资源,要使用require引入相对路径

img.src = '@/assets/pro.png' 加载失败

img.src = require('@/assets/pro.png') 加载成功

  • 或者 可以把图片放在public文件夹下,直接引入

img.src = 'pro.png';

  • 若使用在线的图片,可能会有跨域问题,设置 img.crossOrigin

img.crossOrigin = ""; //解决图片跨域问题

img.src = "https://imgs.699pic.com/images/401/061/200.png!detail.oblique.v1";

其他功能

1. 使用drawImage绘制并裁剪图像

img.onload = () => { canvas.width = img.width; canvas.height = img.height; // 指定裁剪区域 x, y, width, height,以及目标绘制位置 dx, dy, dWidth, dHeight // (img, x, y, width, height, dx, dy, dWidth, dHeight) ctx.drawImage(img, 100, 100, 200, 200, 0, 0, canvas.width, canvas.height); };
代码解释
  1. 定义裁剪区域(100, 100, 200, 200),表示从原图像的(100, 100)开始裁剪,裁剪区域宽高分别为200像素。
  2. 指定了目标绘制位置(0, 0)以及绘制区域的宽高canvas.widthcanvas.height

裁剪如图:

2. 使用drawImage绘制图像并做其他变换

除了裁剪之外,我们还可以利用transform方法来改变图像的位置、大小和方向。这里我们将展示如何旋转图像。

img.onload = () => { canvas.width = img.width; canvas.height = img.height; ctx.drawImage(img, 0, 0, canvas.width, canvas.height); // 保存当前的绘图状态 ctx.save(); // 设置转换中心点 ctx.translate(canvas.width / 2, canvas.height / 2); // 旋转 45 度角 ctx.rotate(Math.PI / 4); // Math.PI / 4 = 45deg // 绘制图像 ctx.drawImage(img, -img.width / 2, -img.height / 2, img.width, img.height); // 恢复之前的绘图状态 ctx.restore(); };
代码解释
  1. 使用 translate 方法将坐标系原点移动到画布的中心。
  2. 使用 rotate 方法旋转坐标系。
  3. 使用 drawImage 方法绘制图像,通过减去图像的一半宽度和高度来确保图像绘制在新的坐标系原点上。
  4. 使用 save 和 restore 方法来保存和恢复绘图状态,避免影响后续的绘图操作。

旋转如图:

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/9 11:30:36

Fluke福禄克754 753 725 724 726过程校验仪

‌福禄克754&#xff08;Fluke 754/754 PLUS&#xff09;是福禄克公司推出的多功能过程校验仪‌&#xff0c;专为工业现场校准、维护和故障诊断设计&#xff0c;支持HART通信协议&#xff0c;可测量和输出电压、电流、温度、压力等多种信号。‌‌ 1‌‌ 2 核心功能与技术特点 ‌…

作者头像 李华
网站建设 2026/8/12 12:16:22

事件冒泡踩坑记:一个TDesign Checkbox引发的思考

最近在项目中遇到一个很"诡异"的问题&#xff1a;点击 t-checkbox 组件时&#xff0c;父元素的点击事件居然被触发了&#xff01;明明只改了复选框状态&#xff0c;怎么父容器也"跟着动"了&#xff1f;今天就跟大家聊聊这个看似简单却暗藏玄机的事件冒泡问…

作者头像 李华
网站建设 2026/8/8 14:38:31

魔盒项目开发纪实:硬件平台搭建以及调试

引言 今天是我魔盒项目的硬件调试日&#xff0c;这是整个项目从设计到实现的关键一步。魔盒项目旨在打造一个智能的物联网设备&#xff0c;能够感知人体存在并通过灯光提供反馈。在这篇博客中&#xff0c;我将详细记录从开发板选择到传感器调试的全过程&#xff0c;分享遇到的问…

作者头像 李华
网站建设 2026/8/12 11:07:38

解锁神秘:自由振动流致振荡的流场坐标转换与POD分析

自由振动流致振荡等无法提前获取运动规律的流场坐标转换方法&#xff08;matlab tecplot联合编程&#xff09;及pod分析方法 含视频教程&#xff0c;实例数据&#xff0c;matlabmcr宏文件等 航空航天&#xff0c;船舶海洋&#xff0c;流体力学等专业必备在航空航天、船舶海洋以…

作者头像 李华
网站建设 2026/8/10 6:41:35

MIT沉浸式实验室如何使用MANUS手套实现远程VR神经外科培训

MIT.nano沉浸式实验室是麻省理工学院的多学科空间&#xff0c;旨在可视化复杂数据和原型沉浸式技术以支持AR和VR研究、动作捕捉以及面向科学、工程和艺术领域用户的数字物理交互。外科训练的挑战现代神经外科技术要求极其精确&#xff0c;尤其是在小儿脑积水手术中。多年来&…

作者头像 李华
网站建设 2026/8/9 18:46:04

本地文件远程秒调!ZFile+cpolar 让文件管理不再受限于局域网

文章目录前言【视频教程】1.关于ZFile2.本地部署ZFile3.使用ZFile4.ZFile的配置5.cpolar内网穿透工具安装6.创建远程连接公网地址7.固定ZFile公网地址前言 ZFile 是一款专注于文件管理的工具&#xff0c;支持本地存储、云存储等多种存储源&#xff0c;能在网页端实现文件上传、…

作者头像 李华