vue canvas拖拽,鼠标中心点缩放,标记点位等

这篇具有很好参考价值的文章主要介绍了vue canvas拖拽,鼠标中心点缩放,标记点位等。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

vue实现canvas画布建立图片,坐标建立,可进行拖拽,鼠标中心点位缩放,标记点位等功能

直接上源码

<!--  -->
<template>
    <div class="canvas-box" ref="canvasBox">
        <img ref="bitmap" :src="imageurl" style="display: none;" />
        <canvas ref="mycanvas" :width="canvaswidth" :height="canvasheight" style="transition:all .3s"
            @mousedown="onmousedown" @mouseup="onmouseup" @mousemove="onmousemove" @mousewheel="onmousewheel"></canvas>
    </div>
</template>

<script>
import { reactive, toRefs } from 'vue'
export default {
    props: {
        imageurl: {
            Type: String,
            default: ""
        },
        tablelist: {
            Type: Array,
            default: []
        }
    },
    data() {
        return {
            canvaswidth: 1497,
            canvasheight: 828,
            mycanvas: null,
            canvasinfo: {
                initialzoom: 1,
                //每次增加多少倍
                everyzoom: 0.1,
                //图片初始位置
                imginitx: 0,
                imginity: 0,
                offset: {
                    x: 0,
                    y: 0
                },
                //鼠标进入离开拖动状态标记
                mousestatus: 0
            },
            imageinfo: {
                width: 0,
                height: 0
            },
            imageinitzoom: 0,
            img: null,
            //记录坐标原点位置
            origin: {
                x: 0,
                y: 0
            }
        }
    },
    created() {
    },
    mounted() {
        this.mycanvas = this.$refs.mycanvas.getContext('2d');

        this.loadImage();
    },
    methods: {
        //加载图片在canvas上
        loadImage() {
            let _this = this;
            _this.bitmap = _this.$refs.bitmap;
            _this.img = _this.bitmap;
            _this.bitmap.onload = (res) => {
                //先计算原图初始宽高,赋值图片适应图层缩放比例
                _this.calculation(res);
                //图片加载完成后绘制在canvas上面
                _this.drawImage();
            };
        },
        //开始绘制canvas
        drawImage() {
            this.mycanvas.clearRect(0, 0, this.canvaswidth, this.canvasheight);
            this.mycanvas.drawImage(this.img, this.canvasinfo.imginitx, this.canvasinfo.imginity, this.imageinfo.width / this.imageinitzoom * this.canvasinfo.initialzoom, this.imageinfo.height / this.imageinitzoom * this.canvasinfo.initialzoom);
            debugger;
            this.addpoint();
        },

        addpoint() {
            let _this = this;
            let iconimg = new Image();
            iconimg.src = require('@/assets/broadcast/111.png');
            iconimg.onload = (res) => {
                for (let i = 0; i < _this.tablelist.length; i++) {
                    // 将x,y坐标转化为相对图层坐标
                    let iconx = _this.tablelist[i].devPx  / (_this.imageinitzoom/this.canvasinfo.initialzoom) + _this.canvasinfo.imginitx;
                    let icony = (_this.origin.y - _this.tablelist[i].devPy) / (_this.imageinitzoom/this.canvasinfo.initialzoom) + _this.canvasinfo.imginity;
                    _this.mycanvas.drawImage(iconimg, iconx-res.target.width/2, icony-res.target.height/2, res.target.width, res.target.height);
                }
            };
            iconimg.onerror = (res) => {
                debugger;
            }
        },

        //计算要建立的坐标原点,并计算图片相对于图层缩小倍数
        calculation(res) {
            if (res.target.height > this.canvasheight) {
                this.imageinitzoom = res.target.height / this.canvasheight;
            } else {
                this.imageinitzoom = res.target.width / this.canvaswidth;
            }
            if (this.imageinitzoom < this.canvasinfo.initialzoom) {
                this.imageinitzoom = this.canvasinfo.initialzoom;
            }
            this.imageinfo.width = res.target.width;
            this.imageinfo.height = res.target.height;
            this.origin.x = this.canvasinfo.imginitx;  //原点坐标x为相对left的偏移量
            this.origin.y = res.target.height + this.canvasinfo.imginity;  //原点坐标y为图片的高度+相对top的偏移量   
        },
        /** 记录画面鼠标的位置 */
        getMousePosition(e) {
            return {
                x: e.offsetX,
                y: e.offsetY
            }
        },
        //鼠标按下操作
        onmousedown(e) {
            this.canvasinfo.mousestatus = 1 // 记录鼠标进入1状态
            this.canvasinfo.offset = this.getMousePosition(e) // 记录鼠标的坐标点
        },
        onmouseup(e) {
            this.canvasinfo.mousestatus = 0 // 记录鼠标进入1状态
        },
        onmousemove(e) {
            console.log("x:" + Math.floor((e.offsetX - this.canvasinfo.imginitx) * this.imageinitzoom / this.canvasinfo.initialzoom) + "------ y:" + Math.floor(this.origin.y - ((e.offsetY - this.canvasinfo.imginity) * this.imageinitzoom / this.canvasinfo.initialzoom)));
            if (this.canvasinfo.mousestatus === 1) {
                this.canvasinfo.imginitx += (e.offsetX - this.canvasinfo.offset.x);
                this.canvasinfo.imginity += (e.offsetY - this.canvasinfo.offset.y);
                this.canvasinfo.offset = this.getMousePosition(e)
                this.drawImage();
            }
        },
        onmousewheel(e) {
            //计算偏移量来进行缩放,如果鼠标位置不动,e.offsetX要保持不变
            let changex = (e.offsetX - this.canvasinfo.imginitx) / this.canvasinfo.initialzoom * this.canvasinfo.everyzoom;
            let changey = (e.offsetY - this.canvasinfo.imginity) / this.canvasinfo.initialzoom * this.canvasinfo.everyzoom;
            this.canvasinfo.offset = this.getMousePosition(e)
            if (e.wheelDelta > 0) {
                this.canvasinfo.initialzoom += this.canvasinfo.everyzoom;
                this.canvasinfo.imginitx -= changex;
                this.canvasinfo.imginity -= changey;

            } else {
                if (parseInt(this.canvasinfo.initialzoom * 100) / 100 > this.canvasinfo.everyzoom) {
                    this.canvasinfo.initialzoom -= this.canvasinfo.everyzoom;
                    this.canvasinfo.imginitx += changex;
                    this.canvasinfo.imginity += changey;
                }
            }
            this.drawImage();
        }
    },
};
</script>
<style ref="stylecscc/scss" lang="scss" scoped>
.canvas-box {
    background: #03333f;
}
</style>

仅供学习使用文章来源地址https://www.toymoban.com/news/detail-583948.html

到了这里,关于vue canvas拖拽,鼠标中心点缩放,标记点位等的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【opencv3】鼠标框选矩形并显示当前像素点坐标和矩形中心点坐标C++

    (1)用鼠标在图中框选矩形目标,然后保存框选的图片; (2)鼠标拖动过程中要求显示框的线条以及鼠标当前像素点信息(坐标和RGB值); (3)拖动完成后单独显示框取的图像,拖动完成后cout输出框中心像素点坐标。 鼠标事件: 鼠标左键按下时(event == CV_EVENT_LBUTTONUP),标

    2024年02月09日
    浏览(49)
  • unity shader中获得模型中心点 + 中心点详解

    参考连接: Unity Shader中获取模型中心点的世界坐标_unity获取物体坐标_VirtualCreator的博客-CSDN博客 实际是当前材质球挂接的Renderer的mesh定义的坐标原点,但是有两种情况: 1 Renderer是MeshRender 原点就是当前mesh的坐标原点. 当前body的mesh , 坐标中心就是原点 2 SkinnedMeshRender  是Ro

    2024年02月13日
    浏览(51)
  • PCL圆柱中心轴线提取、中心点提取

    适用于 圆柱中心轴线计算,轴线的端点、中心点计算 附代码完整实现及测试代码。 相关链接: C++ PCL点云圆柱结构提取/立杆结构提取

    2024年02月14日
    浏览(55)
  • 直线围绕中心点旋转(类似时钟)

    2024年04月09日
    浏览(59)
  • unity 获取复杂物体(模型)中心点

    2024年02月02日
    浏览(56)
  • UE4中修改模型的中心点

    在UE4中的模型中心点一般都在模型的中点,如果是门这样的模型,我们就不能绕中心点旋转了,不然会觉得很奇怪。但是默认的静态网格体中心点都在物体中心,那我们怎么办?有两种方法: 1.我们就需要移动物体的中心点 2.在三维建模软件中移动模型中心点 下面我们就讨论

    2023年04月08日
    浏览(68)
  • Unity将模型的世界坐标下的中心点归到模型中心

    效果对比: 调整前: 调整后: 需求:由于建模时的疏忽或者网上找的一些测试模型不规范,会出现导入unity中,模型的世界坐标下的中心点与模型实际的位置差出很多。 注意:物体中心点和父物体中心点的设置代码隐忍而异,看模型结构需求 注意:这里模型的位置必须Re

    2024年02月03日
    浏览(59)
  • WPF中有中心点的slider滑动条

    想要实现的效果 原生滑动条 需要认识一下滑动条的组成 在原生控件中生成“资源字典”对应的样式 然后在track所在的列进行添砖加瓦 由于track在row=\\\"1\\\"的位置,只需要在这个位置上面添加一个Ellipse和Line Ellipse是来描述固定在滑动条上的中心点的位置 line是来描述Thumb从中心点

    2024年02月08日
    浏览(53)
  • uniapp小程序地图设置中心点位置向上偏移

    图示: id=\\\"map\\\" ref=\\\"map\\\"

    2024年02月11日
    浏览(67)
  • 高德API JS 高德地图获取多个坐标点的中心点

    我需要: 在地图上展示多个地点 地图缩放到合适的大小,要求刚好能显示全部点位 边缘留有一部分间隔。 做成如图所示这样。 经过一下午的研究,弄出来了。 需要以下这些 AMap 的类库: AMap.Bounds() 区域 AMap.LngLat() 点坐标(基础点位) AMap.setBounds() 设置地图区域,这会自动

    2024年02月07日
    浏览(59)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包