IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> 小程序 自动生成海报 二维码可调节 -> 正文阅读

[JavaScript知识库]小程序 自动生成海报 二维码可调节

<template>
  <div class="generatePicture">
    <div class="contianer"
         :style="src ? {
        backgroundImage:'url('+src+')'
      } : ''">
      <image class="code"
             id="code"
             :style="{
                top: top + 'px',
                left: left + 'px',
                width:width+'px',
                height:height + 'px'
             }"
             @touchmove="codeMove"
             @touchstart="codeStart"
             :src="codesrc"
             alt=""></image>
    </div>
    <div class="btn"
         @click="changeBg">更换背景</div>
    <div class="btn save"
         @click="initCanvas">生成图片</div>
    <canvas class="canvasId"
            canvas-id="canvasId"
            style="width: 90vw; height: 80vh;" />
  </div>
</template>
<script>
export default {
  name: 'generatePicture',
  data () {
    return {
      bw: 0, // 背景板宽
      bh: 0,
      bleft: 0, // 背景定位
      btop: 0,
      left: 0, // 二维码定位
      top: 0,
      x: 0,
      y: 0,
      width: 200, // 二微码宽度
      height: 200,
      src: '', // 背景图
      ctx: {},
      type: 'move',
      // 二维码图
      codesrc: 'http://open.weixin.qq.com/qr/code?username=develong'
    }
  },
  mounted () {
    this.getElement('.contianer')
  },
  methods: {
    codeStart (event) {
      this.x = event.clientX - this.left
      this.y = event.clientY - this.top
      console.log(this.x, this.y, this.height, this.width)
      if (this.y < 30 || this.y > (this.height - 30) || this.x < 30 || this.x > (this.width - 30)) {
        this.type = 'change'
      } else {
        this.type = 'move'
      }
    },
    getElement (id = '') {
      let _query = wx.createSelectorQuery()
      _query.select(id).boundingClientRect()
      _query.exec((res) => {
        // 初始化code 位置
        console.log(res)
        this.left = res[0].width / 2 - 100
        this.top = res[0].height / 2 - 100
        this.bw = res[0].width
        this.bh = res[0].height
        this.bleft = res[0].left
        this.btop = res[0].top
        // this.initCanvas()
      })
    },
    codeMove (event) {
      if (this.type === 'move') {
        this.move(event)
      } else {
        this.change(event)
      }
    },
    change (event) {
      let movex = event.clientX - this.left - this.x
      let movey = event.clientY - this.top - this.y
      console.log(event.clientX, this.x, this.width, this.y, this.height)
      if (this.x < 30) {
        this.width = this.width - movex
        this.move(event, 'notY')
      }
      if (this.x > (this.width - 30)) {
        this.width = this.width + movex
        this.x = this.x + movex
      }
      if (this.y < 30) {
        this.height = this.height - movey
        this.move(event, 'notZ')
      }
      if (this.y > (this.height - 30)) {
        this.height = this.height + movey
        this.y = this.y + movey
      }
    },
    move (event, type) {
      let movex = event.clientX - this.left - this.x
      let movey = event.clientY - this.top - this.y
      if ((this.left + movex + 16) > this.bleft && ((this.left + movex) < (this.bleft + this.bw - this.width - 16)) && type !== 'notZ') {
        this.left = this.left + movex
      }
      if ((this.top + movey) > this.btop && ((this.top + movey) < (this.btop + this.bh - this.height)) && type !== 'notY') {
        this.top = this.top + movey
      }
    },
    changeBg () {
      let _this = this
      wx.chooseImage({
        count: 1,
        success: function (res) {
          _this.src = res.tempFilePaths[0]
        }
      })
    },
    initCanvas () {
      this.ctx = wx.createCanvasContext('canvasId')
      // this.ctx.setStrokeStyle('#000')
      // console.log(this.ctx, this.width, this.height)
      // this.cxt.globalCompositeOperation = 'destination-over'
      let _this = this
      if (this.src) {
        this.ctx.drawImage(this.src, 0, 0, this.bw, this.bh)
        // this.ctx.draw()
      }
      if (this.codesrc.indexOf('http') > -1) {
        wx.getImageInfo({
          src: this.codesrc,
          success (res) {
            console.log(res)
            _this.ctx.drawImage(res.path, _this.left, _this.top, _this.width, _this.height)
            _this.ctx.draw(false, () => {
              _this.save()
            })
          }
        })
      } else {
        this.ctx.drawImage(this.codesrc, this.left, this.top, this.width, this.height)
        this.ctx.draw()
      }

      // // this.ctx.draw()
      // this.ctx.fillText('你要添加的文字', 0, 90) // 在画布上绘制被填充的文本

      // this.ctx.setTextAlign('center') // 文字居中

      // this.ctx.setFillStyle('#a00b0f') // 文字颜色:黑色
    },
    save () {
      wx.canvasToTempFilePath({ // 将canvas生成图片
        canvasId: 'canvasId',
        x: 0,
        y: 0,
        width: this.bw,
        height: this.bh,
        destWidth: this.bw, // 截取canvas的宽度
        destHeight: this.bh, // 截取canvas的高度
        success: function (res) {
          wx.saveImageToPhotosAlbum({ // 保存图片到相册
            filePath: res.tempFilePath,
            success: function () {
              wx.showToast({
                title: '生成图片成功!',
                duration: 3000
              })
            }
          })
        }
      })
    }
  }
}
</script>
<style>
.generatePicture {
  display: flex;
  flex-direction: column;
  align-items: center;
}
.contianer {
  /* background-image:url("http://mpvue.com/assets/logo.png");  */
  background-color: #f4f4f4;
  width: 90vw;
  background-size: 100% 100%;
  height: 80vh;
  padding: 0;
  position: relative;
}
.code {
  position: absolute;
}
.code::after{
  position: absolute;
  width: 100%;
  height: 100%;
  content: "";
  display: block;
  border: 30px solid #f42;
  opacity: 0.3;
  top:0;
  left: 0;
  box-sizing: border-box;
}
.btn {
  width: 100%;
  height: 40px;
  line-height: 40px;
  text-align: center;
  margin: 5px 0;
  background: #f4f4f4;
}
.btn.save{
   background: greenyellow
}
.canvasId {
  opacity: 0;
  z-index: 0;
  position: absolute;
  top: -80vh;
}
</style>
  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2022-04-26 11:33:45  更:2022-04-26 11:34:15 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 2:07:43-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码