首页 > 其他分享 >功能实现:canvas图片缩放与移动

功能实现:canvas图片缩放与移动

时间:2024-05-27 12:30:55浏览次数:18  
标签:canvas scale const cwidth 缩放 cheight 移动 图片

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>canvas图片缩放与移动</title>
    <style>
      * {
        margin: 0;
        padding: 0;
      }
      #canvas {
        position: absolute;
        top: 20px;
        left: 50%;
        width: 400px;
        height: 400px;
        transform: translateX(-50%);
        background: #f7f7f7;
      }
    </style>
  </head>
  <body>
    <button id="output">点击导出为图片</button>
    <canvas id="canvas" width="400" height="400"></canvas>
    <script type="module">
      const canvas = document.querySelector("#canvas");
      const output = document.querySelector("#output");
      const ctx = canvas.getContext("2d");
      canvas.width = 400 * devicePixelRatio;
      canvas.height = 400 * devicePixelRatio;

      const cwidth = canvas.width
      const cheight = canvas.width
      //等待图片加载完成
      const pic = new Image();
      //你自己的图片地址
      pic.src = "./naroto.webp";
      //图片加载成功够在canvas中绘制
      pic.onload = function () {
        /*  cwidth  canvas内绘制的图片宽度
         * <style></style>标签中的400px则为样式宽度
         */
        ctx.drawImage(pic, 0, 0, cwidth, cheight);
      };


      //缩放倍率
      let scale = 2;
      const resetCanvas = (canvas, scale) => {
        /*  cwidth - scale*cwidth
         *  canvas绘制的图片宽度 - 当前绘制的图片宽度 = 两侧流白空隙
         *  故此除以2才是正确的X值
         */
        let X = (cwidth - scale * cwidth) / 2;
        let Y = (cheight - scale * cheight) / 2;
        /*清空画布*/
        ctx.clearRect(0, 0, cwidth, cheight);
        //重绘图片
        ctx.drawImage(pic, X, Y, cwidth * scale, cheight * scale);
      };
      //最大缩放倍数
      const MAX_SCALE = 5;
      //最小缩放倍数
      const MIN_SCALE = 0.5;
      //每次缩放大小
      const PER_SCALE = 0.5;
      canvas.addEventListener("mousewheel", (e) => {
        e.stopPropagation();
        e.preventDefault()
        if (e.deltaY < 0) {
          if (scale >= MAX_SCALE) return;
          scale = scale + PER_SCALE;
          resetCanvas(canvas, scale);
        } else if (e.deltaY > 0) {
          if (scale <= MIN_SCALE) return;
          scale = scale - PER_SCALE;
          resetCanvas(canvas, scale);
        }
      });
      //canvas移动图片
      let startX = 0
      let startY = 0
      canvas.addEventListener("mousedown", (e) => {
        startX = e.offsetX
        startY = e.offsetY
        canvas.style.cursor = "grab";
        canvas.addEventListener("mousemove", move);
      });
      //鼠标移动事件
      const move = (e) => {
        const x = e.offsetX - (cwidth * scale) / 2;
        const y = e.offsetY - (cheight * scale) / 2;
        //清空画布
        ctx.clearRect(0, 0, cwidth, cheight);
        //重绘图片
        ctx.drawImage(pic, x, y, cwidth * scale, cheight * scale);
      };
      //放开鼠标
      let endX = 0
      let endY = 0
      const remove = (e) => {
        canvas.style.cursor = "default";
        canvas.removeEventListener("mousemove", move);
      };

      //鼠标离开停止
      canvas.addEventListener('mouseleave',remove)

      canvas.addEventListener("mouseup", remove);
      //输出图片
      output.onclick = function () {
        const url = canvas.toDataURL("image/png");
        const img = new Image();
        img.src = url;
        img.width = 200;
        img.height = 200;
        document.documentElement.appendChild(img);
        //下载图片
        //    let link = document.createElement('a');
        //    link.download = '新图片.png';
        //    link.href = url;
        //    link.click();
      };
    </script>
  </body>
</html>

标签:canvas,scale,const,cwidth,缩放,cheight,移动,图片
From: https://blog.csdn.net/qq_55139096/article/details/139233565

相关文章

  • 内网渗透之横向移动
    一、使用文件传输1.1网络共享在网络资源共享中,有admin\(系统目录共享,还有IPC\)共享,是实战中通常建立的共享连接;建立IPC$共享需要以下两个条件:1.远程主机开启了IPC连接2.远程主机的139端口和445端口开放执行以下命令就可以与远程主机建立IPC连接netuse\\10.10.10.19\IPC$......
  • (读后分享)移动Web前端高效开发实战:HTML 5 + CSS 3 + JavaScript + Webpack + React Nat
    链接:pan.baidu.com/s/1tIHXj9HmIYojAHqje09DTA?pwd=jqso提取码:jqsoHTML5新特性与应用:介绍HTML5的新特性,包括语义化标签、本地存储、设备兼容、连接特性等,并讲解如何在移动Web前端开发中充分利用这些特性提升用户体验。CSS3样式与动画设计:详细讲解CSS3的样式设计和动画效果,包......
  • 2024年5月大语言模型论文推荐:模型优化、缩放到推理、基准测试和增强性能
    前一篇文章总结了关于计算机视觉方面的论文,这篇文章将要总结了2024年5月发表的一些最重要的大语言模型的论文。这些论文涵盖了塑造下一代语言模型的各种主题,从模型优化和缩放到推理、基准测试和增强性能。大型语言模型(llm)发展迅速,跟上这些领域新颖的研究将有助于引导模型的持续......
  • Unity2d横板移动有个极小的向下的加速度
    2d横板角色移动在碰撞体边缘刚体会有个向下的极小值-1.776357e-15,如果用加速度判断一些东西会出问题,找了好久发现碰撞盒的size的x轴所影响,修改碰撞盒size的x值可以让他不触发,但值不是固定的,不同的碰撞盒有不同的值,本人初学,原因未知,求大佬解答在大概这个边缘的时候地面碰撞盒......
  • 利用Python+OpenCV实现截图匹配图像,支持自适应缩放、灰度匹配、区域匹配、匹配多个结
    一、依赖安装pipinstallopencv-pythonpipinstallpyautogui二、获取系统缩放比例注意:必须先通过ctypes获取wid之后才能导入pyautogui,如果需要在其它代码中引用该模块,最好把获取分辨率这部分代码放到程序入口处,然后传递给识图函数,避免提前导入pyautogui导致获取分辨率失......
  • 【全开源】教育系统源码(支持微信小程序+移动端H5+安卓APP+IOS-APP)
    构建智慧教育的基石在当今信息化快速发展的时代,教育系统正面临着前所未有的变革。西陆教育系统源码,作为这一变革的先锋力量,以其卓越的性能和灵活性,为教育机构提供了全新的解决方案。一、源码的力量:定制化与可扩展性西陆教育系统源码的核心优势在于其高度的定制化和可扩展......
  • Unity (动画效果 和操控人物移动)
    前沿可以在store上选中自己的模型喜欢然后倒入到你的库中 然后场景中需要设置路线什么的要用到导航 因为天花板是头顶,不是静态的,所以把statc给取消勾选然后windows->>>Ai------>Navigation 点击level模型 然后 点击Bake然后就是烘培了导航 人物移动跟......
  • QTreeView中item节点任意拖拽移动,添加,删除与自绘指示器
    文章目录效果图主要功能点概要遇到的问题指示器拖拽总结效果图主要功能点节点自由拖拽移动自绘树的指示器可拖拽添加节点概要整体还是对于model-view这一套的使用,左侧的实现可看我的这篇文章,本文具体讲讲这个树QTreeView的拖拽与自绘指示器。关于树......
  • vector&字符移动
    #include<iostream>#include<vector>#include<windows.h>#include<conio.h>usingnamespacestd;intmain(){ stringm="ddddddddaaaassaaddddaassaaaadddddddd""dddddddddaaaassaasaaswdddssddwwwaa"; charl[m.size()];......
  • 移动端封装map 组件,调起高德地图
    封装的map.vue<template><view><mapid="popMap"ref="maps":longitude="longitude":latitude="latitude"scale="14":markers="markers"@tap="onMapTap&quo......