news 2026/4/2 10:07:17

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/3/26 22:03:17

28、分布式计算中的事件通知机制解析

分布式计算中的事件通知机制解析 1. 分布式计算中的事件通知需求 在分布式计算环境中,向感兴趣的各方通知数据变更情况是一项常见需求。例如,股票行情程序需向客户端通知股价变化;计算机监控程序要告知管理员系统状态;病毒检测程序在检测到病毒时需警告用户;医疗监控程序…

作者头像 李华
网站建设 2026/4/1 11:37:16

30、COM+ 技术助力企业应用可扩展性提升

COM+ 技术助力企业应用可扩展性提升 1. 事件系统概述 事件是对某些重要数据变化的通知。发布者触发事件,一个或多个订阅者接收该事件。事件系统实现大致可分为紧密耦合事件(TCEs)和松散耦合事件(LCEs)两类。 事件类型 特点 示例 紧密耦合事件(TCEs) 发布者和订阅…

作者头像 李华
网站建设 2026/3/31 15:42:32

运维系列数据库系列【仅供参考】:达梦数据库:DM8锁等待和死锁

达梦数据库:DM8锁等待和死锁 DM8锁等待和死锁 DM事务锁 锁等待 场景一:INSERT锁等待 02 锁等待解决方法 死锁 测试场景如下: DDL锁超时 DM8锁等待和死锁 DM事务锁 创建测试表 create table t_test01(id int primary key, name varchar(20)); select * from t_test01; sel…

作者头像 李华
网站建设 2026/3/28 14:12:35

运维系列数据库系列【仅供参考】:达梦:DM8归档日志挖掘

达梦:DM8归档日志挖掘 DM8归档日志挖掘 一、配置源数据库 二、源数据库模拟数据操作 三、配置本地数据库 01修改dm.ini参数并配置归档 02查询本地魔数 03下载源端归档日志到本地(不要使用xftp下载,会损坏日志 04修改归档日志魔数(依次修改三个归档日志魔数) 05添加归档日志…

作者头像 李华
网站建设 2026/4/1 11:48:05

综合型系统集成商:高端会议室从 “能用” 到 “好用” 的核心赋能者

在高端会议室改造中&#xff0c;系统稳定性、场景适配性与用户体验是核心诉求&#xff0c;需围绕扩声、信号处理、集中控制、无纸化等关键模块选择适配设备。GONSIN 公信会议作为聚焦高端会议场景的综合型系统集成商&#xff0c;其产品体系可针对性解决高端会议室常见的声场不均…

作者头像 李华