uniapp小程序生成海报-直接CV

图片

一个简单的案例:以上则是绘制生成的图片,是由一个背景图片,两个二维码,两行文字组合绘制出的,点击保存按钮即可保存到手机相册(注意所有的在线图片域名都需要在小程序后台配置,否则无法保存)。

其中,"扫码关注-雪天前端" 这一行文本可以通过输入框修改,然后点击重新生成按钮即可重新绘制海报。当然,涉及到的所有元素,无论是背景图,还是二维码或者文字,都可以更换,这里只更改这一行文字,其他的更换大同小异,具体看代码吧。

以下是源码,注释详细,可直接CV见效:

<template>
  <view class="">
    <button @click="setImg()">生成海报</button>
    <canvas :style="{ height: lineBgHeight + 'px;width: 100%;' }" class="gc-canvas"
      canvas-id="firstCanvas"></canvas>
      <input class="ipt" type="text" v-model="txts" placeholder="修改公众号名称">
      <button @click="changeTxt">重新生成</button>
      <button @click="saveImage(myImgs)">保存海报</button>
  </view>
</template>

<script>
  export default {
    data() {
      return {
        txts:'扫码关注-雪天前端',
        lineBgHeight: "",
        erweimaPath: "",
        erweimaOnePath: "",
        myImgs:'', // 最终生成的图片地址
      }
    },
    onShow() {
      this.init()
    },
    methods: {
      //1. 拿到二维码图片地址 用uni.getImageInfo格式化 存于data
      // 在这里可以换图片二维码 一般来自于接口返回或者本地上传
      init(){
        var erweima = 'https://mp-b49e6420-3bf3-44d1-80b5-8c9e8659e39c.cdn.bspapp.com/webPage/home/my.jpg';
        var erweimaOne = 'https://mp-b49e6420-3bf3-44d1-80b5-8c9e8659e39c.cdn.bspapp.com/webPage/home/my.jpg';
        var that = this;
        uni.getImageInfo({
          src: erweima,
          success: function(res) {
            console.log(JSON.stringify(res))
            that.erweimaPath = res.path
          },
        })
        uni.getImageInfo({
          src: erweimaOne,
          success: function(res) {
            console.log(JSON.stringify(res))
            that.erweimaOnePath = res.path
          },
        })
        
      },
      // 2. 生成图片
      setImg() {
        var that = this;
        // 背景图片
        var bgc = 'https://img0.baidu.com/it/u=126160900,2934834914&fm=253&fmt=auto&app=138&f=JPEG?w=800&h=500';
        uni.getImageInfo({
          src: bgc,
          success: function(res) {
            //创建canvas
            let getWindowInfo = uni.getWindowInfo()
            let winWidth = getWindowInfo.windowWidth //屏幕宽度
            let bWidth = winWidth / 375
            that.lineBgHeight = parseInt(130 * bWidth);
            const ctx = uni.createCanvasContext('firstCanvas', that);
            //背景 画出图片
            ctx.drawImage(res.path, 0, 0, winWidth, 130 * bWidth); 
            //二维码1 画出图片
            ctx.drawImage(that.erweimaPath, 180 * bWidth, 26 * bWidth, 80 * bWidth, 80 *
            bWidth); 
            //二维码2 画出图片
            ctx.drawImage(that.erweimaOnePath, 278 * bWidth, 26 * bWidth, 80 * bWidth, 80 *
            bWidth); 
            
            setTimeout(() => {
              var code = "微信公众号";
              ctx.setFontSize(16) //设置字体大小,默认10
              ctx.fillStyle = "#ffffff";
              ctx.fillText(code, 20 * bWidth, 45 * bWidth); //文字内容、x坐标,y坐标
              
              var sizeName = that.txts;//可修改文字
              ctx.setFontSize(parseInt(14 * bWidth)) //设置字体大小,默认10
              ctx.fillStyle = "#ffffff";
              ctx.fillText(sizeName, 20 * bWidth, 85 * bWidth); //文字内容、x坐标,y坐标
              //开始制作
              ctx.draw(false, () => { 
                //使用定时是因为制作水印需要时间,设置定时才不会出bug
                setTimeout(() => { 
                  //将画布中内容转成图片,即水印与图片合成
                  uni.canvasToTempFilePath({ 
                    x: 0,
                    y: 0,
                    width: winWidth, // 截取的画布的宽
                    height: 130 * bWidth,
                    destWidth: winWidth * 10,
                    destHeight: parseInt(130 * bWidth) *
                      10,
                    canvasId: 'firstCanvas',
                    success: (v) => {
                      console.log("图片临时地址" +
                        v.tempFilePath)
                        // 把绘制的地址存于data中 以供下载时传给下载函数
                      that.myImgs = v.tempFilePath
                    },
                    fail: (e) => {}
                  }, that)
                }, 200)
              })
            }, 500);
          },
        })
      },
      
      // 修改文字
      changeTxt(){
        this.setImg()
      },
      
      // 保存图片
      saveImage(url) {
        uni.showLoading({
          title: '下载中...'
        })
        uni.downloadFile({
          url: url,
          success(res) {
            if (res) {
              console.log('下载成功', res)
              uni.hideLoading();
              uni.saveImageToPhotosAlbum({
                filePath: res.tempFilePath,
                success(res) {
                  console.log(res);
                  uni.showToast({
                    title:"保存成功"
                  })
                },
                fail(res) {
                  console.log(res);
                  uni.showToast({
                    title:"保存失败"
                  })
                },
              });
            }
          },
          fail: (err) => {
            if (err) {
              console.log('下载失败', err)
              uni.hideLoading();
            }
          }
        });
      },
    },
  }
</script>

<style>
  .ipt{
    display: block;
    width: 78%;
    margin: 30rpx auto;
    height: 60rpx;
    padding-left: 20rpx;
    color: #333;
    border: 2rpx solid #333;
  }
</style>

图片

此文若有用,求个赞可否?

本文首发于微信公众号:雪天前端, 欢迎扫码关注!

UNIAPP支付宝小程序OCR识别是一种基于图像处理技术的识别功能,主要用于从图片中提取文本信息。支付宝小程序通过集成UNIAPP框架以及相应的第三方插件或API,实现了对支付宝二维码、条形码等图像内容的自动识别,使得用户无需手动输入即可获取到所需信息。 ### 实现过程: 1. **图像捕获**:首先需要将包含待识别信息的图像捕获到程序中,这可以是摄像头拍摄的新照片,或者是已有的存储图像。 2. **预处理**:对原始图像进行预处理,如调整亮度、对比度,去除噪声,以便于后续的图像分析。 3. **特征抽取**:使用计算机视觉算法(如HOG、SIFT、SURF等)提取图像中的关键点和描述符,用于后续匹配和识别。 4. **模板匹配**:比较提取的关键点和描述符与预先训练好的模板库进行匹配,找到最相似的模板。 5. **文本识别**:利用OCR(光学字符识别)技术对匹配到的区域进行文字识别,转换成可读的文字信息。 6. **结果反馈**:将识别出的信息呈现给用户,例如显示在小程序界面上供进一步操作。 ### 应用场景: - 支付宝小程序通过OCR识别功能可以实现在非触屏环境下完成支付、扫码领券、查询账单等功能,提高用户体验。 - 商家可以在店铺展示商品二维码或优惠券码,顾客只需打开小程序扫描即可快速完成购买流程,减少操作步骤。 - 用户还可以利用此功能在实体店面消费后,扫描小票上的二维码获取发票信息,简化了获取电子发票的过程。 ### 开发指南: - **集成OCR插件**:在项目中引入支持OCR功能的插件或SDK,通常此类工具提供简洁的API接口,便于集成到小程序中。 - **配置权限**:确保小程序有访问摄像头和图片文件的权限,以实现图像数据的输入。 - **测试与优化**:针对不同环境、光照条件下的图片进行充分的测试,并根据测试结果优化识别算法的性能和准确率。 --- ### 相关问题: 1. UNIAPP如何集成第三方OCR识别插件? 2. 如何提高支付宝小程序OCR识别的准确率? 3. 小程序中的OCR识别能否处理多种语言的文字识别?
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值