news 2026/9/10 0:03:15

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/9/10 3:27:40

YOLO深度学习模型的训练参数配置与优化

一、总览 def parse_opt(known=False):parser = argparse.ArgumentParser()parser.add_argument(--weights, type=str, default=ROOT / yolov5s.pt, help=initial weights path)parser.add_argument(--cfg, type=str, default=, help=model.yaml path)parser.add_argument(--d…

作者头像 李华
网站建设 2026/9/10 0:10:12

数字孪生可视化模板怎么用?5大行业Demo拆解,帮你快速复用提效

在数字化转型加速推进的当下&#xff0c;数字孪生可视化已成为各行业提升运营效率、优化决策质量的核心工具。但对多数用户而言&#xff0c;新上架的可视化模板往往存在“看着好、用着难”的问题——不熟悉业务板块适配逻辑、不清楚配置要点&#xff0c;导致模板复用效率大打折…

作者头像 李华
网站建设 2026/9/9 2:09:21

必藏!程序员转型AI大模型:机遇、路径与成功率拆解

在程序员圈子里&#xff0c;“技术转型"从来都是绕不开的热门话题。尤其是ChatGPT引爆AI浪潮后&#xff0c;大模型技术以肉眼可见的速度重塑产业格局——从代码生成工具Copilot到智能客服系统&#xff0c;从数据分析平台到自动驾驶决策层&#xff0c;处处都有大模型的身影…

作者头像 李华
网站建设 2026/9/10 8:21:59

如何将照片从 Android 传输到 Android

您还在为将照片从 Android 传输到 Android 而苦苦挣扎吗&#xff1f;您现在可以轻松解决此问题。有 5 种有效的方法可以帮助您在 Android 设备之间传输图片。让我们来看看。第 1 部分&#xff1a;如何一键将照片从 Android 传输到 Android如何一键将照片从一部手机传输到另一部…

作者头像 李华
网站建设 2026/9/9 9:41:42

前端Vue使用js-audio-plugin实现录音功能

在前端 Vue 项目中使用 js-audio-recorder 组件&#xff0c;可按以下流程进行操作&#xff1a;安装组件&#xff1a;在项目根目录下执行npm i js-audio-recorder命令&#xff0c;安装该组件。引入组件&#xff1a;在需要使用录音功能的 Vue 组件中&#xff0c;通过import Recor…

作者头像 李华