vue-drag-resize + html2canvas合成图片并下载

vue-drag-resize + html2canvas 合成图片并下载

可以实现图片拖动,缩放,最后合成一个图片并且下载的功能

一、下载 vue-drag-resize 和 html2canvas

npm install --save vue-drag-resize
npm install --save html2canvas

二、使用
<template>
    <div class="new-page">
        <div id="myH5" :style="{width:parentW+'px',height:parentH+'px',backgroundImage: 'url('+ parentBg +')'}">
            <VueDragResize :aspectRatio="true" :w="codeVw" :h="codeVh" :x="codeLeft" :y="codeTop" :parentLimitation="true" :parentW="parentW" :parentH="parentH"  v-on:resizing="resize($event, 'code')" v-on:dragging="resize($event, 'code')">
            <div class="code" :style="{width: + codeVw+ 'px',height:+codeVh+'px',top: + codeTop+ 'px',left:+codeLeft+'px'}">
                <img :src="code" style="width: 100%;height: 100%" />
            </div>
            </VueDragResize>
        </div>
        <span>x: {{ codeLeft }}</span>
        <span>y: {{ codeTop }}</span>
        <button @click="saveImg('myH5')">保存</button>
    </div>
</template>


<script>
import VueDragResize from 'vue-drag-resize';
import html2canvas from "html2canvas"

export default {
    data() {
        return {
            parentW: 375, // 海报宽度
            parentH: 667, // 海报高度
            // 二维码图片
            code: 'https://i.ibb.co/C8gLnRy/61-754-22a389010e92af1417c669aeeeecfec4-91a712f1aa206fab060e33cacc636d99-1.png',
            // 海报背景
            parentBg: 'http://leads-fm-content.oss-cn-beijing.aliyuncs.com/img/7pSnGjq4JzHL3IkA0TNHSw5rEMir8uogmWFIN0qM.png',
            codeVw: 80, // 二维码宽度
            codeVh: 80, // 二维码高度
            codeTop: 0, // 二维码顶部距离
            codeLeft: 0 // 二维码左边距离
        }
    },
    components: {
        VueDragResize
    },
    methods: {
		
		// 拖动、缩放二维码
        resize(newRect) {
            this.codeVw = newRect.width;
            this.codeVh = newRect.height;
            this.codeTop = newRect.top;
            this.codeLeft = newRect.left;
        },

        // 保存
        saveImg(val) {
            window.pageYoffset = 0;
            document.documentElement.scrollTop = 0;
            document.body.scrollTop = 0;
            // 先获取你要转换为img的dom节点
            var node = document.getElementById(val);//传入的id名称
            var width = node.offsetWidth; //dom宽
            var height = node.offsetHeight; //dom高
            var scale = 2; //放大倍数 这个相当于清晰度 调大一点更清晰一点
            console.log(height);
            console.log(width);
            window.pageYoffset = 0;

            document.documentElement.scrollTop = 0;

            document.body.scrollTop = 0;
            html2canvas(node, {
                width: width,
                heigth: height,
                backgroundColor: "#ffffff", //背景颜色 为null是透明
                dpi: window.devicePixelRatio * 2, //按屏幕像素比增加像素
                scale: scale,
                X: 0,
                Y: 0,
                scrollX: 0, //如果左边多个白边 设置该偏移-3 或者更多
                scrollY: 0,
                useCORS: true, //是否开启跨域配置 !!!
                allowTaint: true //是否允许跨域图像污染画布  !!!
            }).then(canvas => {
                var url = canvas.toDataURL('image/jpeg', 1.0); //这里上面不设值cors会报错
                console.log(url);
                var a = document.createElement("a");//创建一个a标签 用来下载
                a.download = "html2canvas合成图"; //设置下载的图片名称
                var event = new MouseEvent("click");//增加一个点击事件
                a.href = url;//此处的url为base64格式的图片资源
                a.dispatchEvent(event); //触发a的单击事件 即可完成下载
            });
        },

    }
}
</script>

<style scoped lang="less">
    #myH5{
        background-repeat: no-repeat;
        background-size: 100% 100%;
    }
</style>
三、跨域问题

如果出现跨域问题的话,请检查 html2canvas()函数中第二个参数的属性 useCORS: trueallowTaint: true,确保他们的值为 true,如果还不行的话就是你所使用的图片所在的服务器设置了跨域,交给后台处理下服务器设置就行了。

四、vue-drag-resize 属性表
属性名类型作用默认
isActiveBoolean是否激活状态false
isDraggableBoolean是否允许拖拽true
isResizableBoolean是否允许缩放true
aspectRatioBoolean是否等比例缩放false
wNumber组件宽度200
hNumber组件高度200
minwNumber最小宽度50
minhNumber最小高度50
xNumber定位left0
yNumber定位top0
zNumber层级auto
sticksArray元素缩放的节点定义[‘tl’, ‘tm’, ‘tr’, ‘mr’, ‘br’, ‘bm’, ‘bl’, ‘ml’]
preventActiveBehaviorBoolean单击组件外区域来禁止组件行为false
parentLimitationBoolean是否超出父级元素false
parentWNumber父级宽度0
parentHNumber父级高度0
parentScaleXNumber父级水平偏移1
parentScaleYNumber父级垂直偏移1
axisString允许拖拽的方向both
dragHandleString拖拽时的classname
dragCancelString取消拖拽时的classname

钩子函数

属性名类型作用参数
clickedFunction组件点击事件组件实例
activatedFunction点击组件外事件
resizingFunction缩放时事件object
draggingFunction拖拽时事件object
dragstopFunction拖拽结束事件object
上述代码效果图

网页中:

在这里插入图片描述
下载后:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值