news 2026/6/15 18:03:06

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/6/14 21:46:59

26、MSMQ COM 组件编程全解析

MSMQ COM 组件编程全解析 1. MSMQ COM 组件概述 MSMQ 提供了十个 COM 组件,这些组件的功能与 MSMQ C 语言 API 相同,涵盖队列查找、队列管理、消息管理、队列管理和事务处理等方面。以下是这些组件及其功能的详细列表: | 组件 | 功能 | | — | — | | MSMQApplication …

作者头像 李华
网站建设 2026/6/15 16:00:39

27、深入探索排队组件:原理、实践与优化

深入探索排队组件:原理、实践与优化 排队组件概述 排队组件在外观和使用感受上与其他COM组件并无二致。客户端应用程序对排队对象进行方法调用的方式和普通COM对象类似,不过其底层架构能够对这些方法调用进行排队处理。 开发排队组件十分简单。你可以按照习惯的方式,使用…

作者头像 李华
网站建设 2026/6/15 11:45:47

CSS容器查询:让组件学会“见机行事“的魔法

最近在给编辑器做工具栏时&#xff0c;被一个优雅的CSS新特性惊艳到了——当工具栏空间不足时&#xff0c;时间信息自动隐藏&#xff1b;侧边栏收起后&#xff0c;它又神奇地出现。这不是JavaScript的功劳&#xff0c;而是CSS容器查询&#xff08;Container Queries&#xff09…

作者头像 李华
网站建设 2026/6/14 22:35:20

Spring Boot 学习心得:从配置繁琐到开发高效的蜕变

接触 Spring Boot 前&#xff0c;我用传统 Spring 框架开发项目时&#xff0c;常被海量 XML 配置、依赖版本冲突搞得焦头烂额。通过系统课程学习后&#xff0c;我不仅掌握了 Spring Boot 的核心用法&#xff0c;更在编程思路上完成了从 “配置驱动” 到 “约定优于配置” 的转变…

作者头像 李华
网站建设 2026/6/15 12:54:14

探索DY溢出指数模型:基于多种模型的实证之旅

DY溢出指数模型:基于DCC-GARCH&#xff0c;VAR&#xff0c;LASSO VAR,Ridge VAR,ElasticNet VAR,QVAR和TVP-VAR模型的dy溢出指数计算&#xff0c;只需提供数据&#xff0c;商家提供实证结果(以Excel形式提供)在金融领域&#xff0c;理解变量之间的动态溢出效应对于风险管理和投…

作者头像 李华
网站建设 2026/6/15 11:46:34

负氧离子传感器:实时跟踪负氧离子浓度变化

负氧离子传感器是一种能够实时监测空气中负氧离子浓度的设备&#xff0c;广泛应用于空气质量监测、环境评估、健康研究以及旅游景区管理等领域。以下是对负氧离子传感器的详细介绍&#xff1a;一、工作原理负氧离子传感器主要基于以下两种原理进行工作&#xff1a;电容式吸入法…

作者头像 李华