16、小程序OCR字体识别

一、方法一:直接用wx.request来访问

缺点:需要备案访问百度APIURL,临时测试可以关闭http检查

效果:

//按钮调用

  BtnGetOcr: function () {

    this.GetOcr()

  },

  async GetOcr() {

    //选择图片

    let ret = await this.chooseImg()

    let ImgUrl = ret.tempFilePaths[0]

    //设置图片到界面显示

    this.setData({

      imageUrl: ImgUrl

    })

    //转换图像格式,这个函数虽然是 wx.request 但是不用备案url

    ret = await this.ToBase64(ImgUrl)

    const base64 = wx.arrayBufferToBase64(ret.data);

    //获取accesToken,需要备案url,测试可暂时屏蔽http检查

    ret = await this.GetAccesToken()

    const AccesTokenS = ret.data.access_token

    //由图片和AccesToken获取结果,需要备案url,测试可暂时屏蔽http检查

    ret = await this.BaiDuApi(base64, AccesTokenS)

    //结果输出

    var ssT = "";

    for (let i = 0; i < ret.data.words_result.length; i++) {

      ssT = ssT + "///" + ret.data.words_result[i].words

    }

    //显示结果到界面上

    this.setData({

      OcrRet: ssT

    })

  },

  chooseImg() {

    return new Promise((resolve, reject) => {

      wx.chooseImage({

        count: 1,

        sizeType: ['original', 'compressed'],

        sourceType: ['album', 'camera'],

        success: (res) => {

          resolve(res)

        },

        fail: (error) => {

          reject(error)

        }

      })

    })

  },

  ToBase64(ImgUrl) {

    return new Promise((resolve, reject) => {

      wx.request({

        url: ImgUrl,

        responseType: 'arraybuffer',

        success: (res) => {

          resolve(res)

        },

        fail: (error) => {

          reject(error)

        }

      })

    })

  },

  GetAccesToken() {

    var APIKey = 'qUe7CbvLDdtDcHHwYVOdna0g'

    var SecretKey = 'W3GHErGNNy9l5RfAaRh0n8XUbRundCy7'

    return new Promise((resolve, reject) => {

      wx.request({

        url: 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=' + APIKey + '&client_secret=' + SecretKey + '&',

        method: 'POST',

        dataType: "json",

        header: {

          'content-type': 'application/json; charset=UTF-8' // 默认值,这里固定

        },

        header: {

          'content-type': 'application/json'

        },

        success: (res) => {

          resolve(res)

        },

        fail: (error) => {

          reject(error)

        }

      })

    })

  },

  BaiDuApi(base64, accesToken) {

    return new Promise((resolve, reject) => {

      wx.request({

        url: 'https://aip.baidubce.com/rest/2.0/ocr/v1/general_basic?access_token=' + accesToken,

        data: {

          image: base64

        },

        method: 'post',

        header: {

          'Content-Type': 'application/x-www-form-urlencoded'

        },

        success: (res) => {

          resolve(res)

        },

        fail: (error) => {

          reject(error)

        }

      })

    })

  },

二、方法二:使用云开发

优点:不需要备案任何url

1、新建云函数并安装npm install --save wx-server-sdk@latest

2、安装百度nmp api:npm install baidu-aip-sdk

3、云函数只用到这两个npm,不要在安装多了(如npm install request-promise),多安装的会把npm install baidu-aip-sdk覆盖,导致用不了

4、云函数主体

// 云函数入口文件

const cloud = require('wx-server-sdk')

let AipOcrClient = require("baidu-aip-sdk").ocr;

cloud.init();

// 云函数入口函数

exports.main = async (event, context) => {

  // 设置APPID/AK/SK

  let APP_ID = "18935791";

  let API_KEY = "qUe7CbvLDdtDcHHwYVOdna0g";

  let SECRET_KEY = "W3GHErGNNy9l5RfAaRh0n8XUbRundCy7";

  // 新建一个对象,保存一个对象调用服务接口

  let client = new AipOcrClient(APP_ID, API_KEY, SECRET_KEY);

  let fileID = event.fileID;

  let res = await cloud.downloadFile({

    fileID: fileID,

  })

  let image = res.fileContent.toString("base64");

  // 调用通用文字识别, 图片参数为远程url图片

  return client.generalBasic(image);

  //console.log(result);

  // .then(function (result) {

  //   let result = JSON.stringify(result);

  //   return result;

  // })

}

5、调用

BtnCloud1: function () {

    this.GetOcr1()

  },

  async GetOcr1(path) {

    try {

      //选择图片

      let ret = await this.chooseImg()

      let path = ret.tempFilePaths[0]

      //设置图片到界面显示

      this.setData({

        imageUrl: path

      })

      //上传文件到云文件中,会返回一个文件ID

      ret = await this.UploadImg(path)

      let FileIdS = ret.fileID

      // 云函数调用,传入文件ID

      ret = await this.CloudOcrFunction(FileIdS)

      //结果输出

      var ssT = "";

      for (let i = 0; i < ret.result.words_result.length; i++) {

        ssT = ssT + "///" + ret.result.words_result[i].words

      }

      this.setData({

        OcrRet: ssT

      })

      //删除云文件夹的文件

      ret = await this.DeleteImg(FileIdS)

    }

    catch (e) {

      console.log(e);

    }

  },

  UploadImg(path) {

    //这里名字一定不能用一样的,会造成识别出来结果不更新,一直用上一张图片做识别

    let name = path.substring(path.lastIndexOf('/') + 1, path.lastIndexOf('.'));;

    return new Promise((resolve, reject) => {

      wx.cloud.uploadFile({

        cloudPath: name,

        filePath: path, // 文件路径

        success: (res) => {

          resolve(res)

        },

        fail: (error) => {

          reject(error)

        }

      })

    })

  },

  CloudOcrFunction(fileidT) {

    return new Promise((resolve, reject) => {

      wx.cloud.callFunction({

        name: "BaiDuOcrTY",//这个名字一定要跟云函数文件夹里的命名一样

        data: {

          fileID: fileidT

        },

        success: function (res) {

          resolve(res)

        },

        fail: function (error) {

          reject(error)

        }

      })

    })

  },

  DeleteImg(path) {

    let name = 'ocr2';

    return new Promise((resolve, reject) => {

      wx.cloud.deleteFile({

        fileList: [path],

        success: (res) => {

          resolve(res)

        },

        fail: (error) => {

          reject(error)

        }

      })

    })

  },

三、云获取AccesToken

//这里只是测试,实际上云识别是不用像本地识别一样,需要获取AccesToken

1、云函数主体:

// 云函数入口文件

const cloud = require('wx-server-sdk')

var rp = require('request-promise')//配置依赖库

cloud.init()

// 云函数入口函数

exports.main = async (event, context) => {

  var APIKey = 'qUe7CbvLDdtDcHHwYVOdna0g'

  var SecretKey = 'W3GHErGNNy9l5RfAaRh0n8XUbRundCy7'

  let url = 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=' + APIKey + '&client_secret=' + SecretKey + '&';

  return await rp({

    uri: url,

    method: 'POST',

    header: {

      'content-type': 'application/json; charset=UTF-8' // 默认值,这里固定

    },

  })

    .then(function (res) {

      return res

    })

    .catch(function (err) {

      return '失败'

    });

}

2、调用

  BtnCloud: function () {

    let that = this;

    wx.cloud.callFunction({

      name: "BaiduOcr",//这个名字一定要跟云函数文件夹里的命名一样

      success: function (res) {

        console.log("成功调用", res),

          console.log("111", JSON.parse(res.result))

      },

      fail: function (res) {

        console.log("失败调用", res)

      }

    })

  },

})

效果:

注:云函数用;的地方假如用了,它编译不会报错,在调用时报:失败调用 Error: errCode: -404011 cloud function execution error | errMsg: cloud.callFunction:fail requestID 93d35ba8-6e38-11ea-af5f-525400e4521d, cloud function service error code -504002, error message Unexpected token return; at cloud.callFunction api

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值