news 2026/8/1 14:05:42

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/2 5:29:39

常用日志积累

1)正则查询cat protocol-2025-12-12.log | grep -E PRT_PAY_BUY_*|PAY_NOT_CAN_CHARGE|PRT_GIFT_FUN_SYN | grep 104936含义:查询还有购买的&#xff0c;购买不成功的&#xff0c;同步购买次数协议。

作者头像 李华
网站建设 2026/8/1 4:31:02

2025CTF逆向工程“新范式”:当Jadx装上AI大脑,逆向效率提升

随着人工智能技术的快速发展&#xff0c;2025年以来&#xff0c;Model Context Protocol&#xff08;MCP&#xff09;逐渐成为逆向工程领域的新宠。各类主流工具如IDA、Jadx等纷纷推出对应的MCP插件&#xff0c;通过结合大模型能力&#xff0c;大幅提升了代码分析效率。尽管早期…

作者头像 李华
网站建设 2026/8/1 17:56:06

2025年AI学习必备网站与高效上手全攻略:从认知到实战的完整路径

在塔猴、Coursera、edX和B站构成的多元化学习生态中&#xff0c;超过2500万用户正在通过系统化课程掌握AI技能。而Perplexity、Midjourney等前沿AI工具则从应用端简化了入门门槛。如今&#xff0c;AI技术已不再仅仅是一个前沿概念&#xff0c;它正逐渐转变为一项必备的职场技能…

作者头像 李华
网站建设 2026/7/31 21:55:14

oracle迁移到sqlserver的注意点

迁移工具可以考虑结合&#xff1a; 1.kdts在转换sysdate默认值字段的时候会错误&#xff0c;在sqlserver中可以考虑改用getdate()或sysdatetime()&#xff0c;精度不同。分区表迁移到sqlserver自动转成普通表。 2.ssma for oracle&#xff0c;需vpn下载 https://www.microsof…

作者头像 李华
网站建设 2026/7/30 14:00:52

从零到精通大型语言模型(LLM):一篇必藏的技术全景指南

大型语言模型(LLM)代表从指令编程到学习型智能的范式革命&#xff0c;通过海量文本数据训练而非明确规则。从ELIZA到GPT-4&#xff0c;LLM经历了六个数量级的参数增长。其工作流程包括分词、嵌入和Transformer三个步骤&#xff0c;通过自注意力机制理解语言模式。尽管面临幻觉、…

作者头像 李华
网站建设 2026/8/1 22:03:53

5种可靠方法将数据从iQOO传输到iPhone

您使用iQOO手机已经很久了&#xff0c;在升级到新型号时可以轻松地将数据从一个iQOO设备传输到另一个iQOO设备。现在&#xff0c;您收到了一部全新的iPhone作为礼物&#xff0c;但有一个问题&#xff1a;您不确定如何将所有数据从iQOO传输到新iPhone。手动逐个项目移动所有内容…

作者头像 李华