【SH】微信小程序调用EasyDL零门槛AI开发平台的图像分类研发笔记

news2024/12/15 11:41:57

文章目录

  • 微信小程序字符串
    • 字符串模板
    • 字符串拼接
  • 上传图片
    • 编写JS代码
    • 编写wxml代码
    • 编写wxss代码
  • GET请求测试
    • 编写测试代码
    • 域名不合法问题
  • GET和POST请求测试
    • 编写JS代码
    • 编写wxml代码
    • 编写wxss代码
  • 效果展示

微信小程序字符串

字符串模板

这是ES6引入的特性,允许你通过反引号(`)创建模板字符串,并在其中嵌入变量或表达式。

let name = 'Alice';
let age = 25;
let message = `My name is ${name} and I am ${age} years old.`;
console.log(message);  // 输出: My name is Alice and I am 25 years old.

字符串拼接

通过加号(+)将多个字符串和变量拼接在一起。

let name = 'Alice';
let age = 25;
let message = 'My name is ' + name + ' and I am ' + age + ' years old.';
console.log(message);  // 输出: My name is Alice and I am 25 years old.

上传图片

图像数据,base64编码,要求base64编码后大小不超过4M,最短边至少15px,最长边最大4096px,支持jpg/png/bmp格式 注意请去掉头部

媒体 / 图片 / wx.chooseImage(弃用)
媒体 / 视频 / wx.chooseMedia
文件 / FileSystemManager / FileSystemManager.readFile

编写JS代码

// index.js
Page({
  /**
   * 页面的初始数据
   */
  data: {
    imagePaths: [], // 用于存储图片路径的数组
    imageBase64: '', // 用于存储图片转换成的Base64编码
  },

  // 按钮点击事件处理函数
  chooseAndUploadImage: async function () {
    try {
      //刷新数据
      this.setData({
        imagePaths: [],
        imageBase64:'',
        imageClassification:{}
      });

      // 图片上传
      const getImageInfo = await this.uploadImage();
      console.log('图片上传成功', getImageInfo.tempFiles);
      this.setData({
        imagePaths: [getImageInfo.tempFiles[0].tempFilePath]
      });
      // 编码转换
      const getBase64 = await this.convertToBase64(getImageInfo.tempFiles[0].tempFilePath);
      console.log('转换Base64编码成功!');
      // console.log('编码转换成功', getBase64.data);
      this.setData({
        imageBase64: getBase64.data
      });
      // console.log('页面Base64编码参数值:', this.data.imageBase64);

    } catch (error) {
      // 处理错误
      console.error('图片上传操作失败:', error);
      // 可以给用户一个错误提示
      // wx.showToast({ title: '请求失败', icon: 'none' });
    }
  },
  uploadImage: function () {
    return new Promise((resolve, reject) => {
      // 选择图片
      wx.chooseMedia({
        count: 1, // 允许选择的图片数量
        mediaType: ['image'], // 文件类型
        sourceType: ['album', 'camera'], // 可以指定来源是相册还是相机
        sizeType: ['original', 'compressed'], // 是否压缩所选文件,基础库2.25.0前仅对 mediaType 为 image 时有效,2.25.0及以后对全量 mediaType 有效 
        camera: 'back', // 仅在 sourceType 为 camera 时生效,使用前置或后置摄像头
        success(res) {
          resolve(res)
          // 上传成功后的回调
          // console.log('上传成功', res.tempFiles); // 这里可以处理服务器返回的数据
          // console.log(res.tempFiles[0].tempFilePath)
          // console.log(res.tempFiles[0].size)
        },
        fail(err) {
          reject(err);
          // 选择图片失败后的回调
          console.error('选择图片失败', err);
        }
      });
    });
  },
  // 图片转base64编码函数
  convertToBase64: function (filePath) {
    return new Promise((resolve, reject) => {
      const fs = wx.getFileSystemManager();
      fs.readFile({
        filePath: filePath,
        encoding: 'base64',
        success(res) {
          // const base64Data = 'data:image/png;base64,' + res.data; // 注意:这里假设图片是png格式,你需要根据实际情况修改MIME类型
          resolve(res);
        },
        fail(err) {
          reject(err);
        }
      });
    });
  }
})

编写wxml代码

<!--pages/index/index.wxml-->
<view class="disease">
  <button bindtap="chooseAndUploadImage">选择图片</button>
  <block wx:if="{{imagePaths.length > 0}}">
    <!-- <image src="{{imagePaths[0]}}" mode="widthFix" style="width: 100%;"></image> -->
    <image class="fixed-image" src="{{imagePaths[0]}}" mode="aspectFit"></image>
  </block>
  <block wx:else>
    <text>没有选择图片</text>
  </block>
</view>

编写wxss代码

/* 疾病图片样式 */
.disease {
  text-align: center;
  padding: 20px;
}

.fixed-image {
  width: 100%; /* 宽度设为100% */
  height: 300px; /* 你可以根据需要调整高度 */
  object-fit: cover; /* 确保图片按比例缩放并填充容器 */
  display: block; /* 移除图片下方的默认间隙 */
  margin: 0 auto; /* 居中显示 */
}

GET请求测试

编写测试代码

在页面的JS文件中写入如下代码:

// 假设这是一个页面(page)的 JS 文件
Page({
  data: {
    responseData: {}  // 用于存储服务器返回的响应数据
  },

  // 按钮点击事件,触发 POST 请求
  handleButtonClick: function() {
    wx.request({
      url: 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=替换为你的API_KEY&client_secret=替换为你的SECRET_KEY',  // 请求的 URL
      method: 'GET',  // 指定请求方法为 GET
      header: {  // 根据服务器要求设置请求头
        'content-type': 'application/json'
      },
      success: (res) => {
        // 请求成功时执行的回调函数
        console.log('请求成功', res.data);
        this.setData({
          responseData: res.data  // 将响应数据存储在页面的 data 中
        });
      },
      fail: (error) => {
        // 请求失败时执行的回调函数
        console.error('请求失败', error);
      }
    });
  }
});

在 WXML 文件中添加一个按钮:

<!-- 假设这是页面的 WXML 文件 -->
<view>
  <button bindtap="handleButtonClick">发送 POST 请求</button>
  <view>
    <!-- 显示服务器返回的响应数据 -->
    <text>{{responseData['refresh_token']}}</text>
  </view>
</view>

域名不合法问题

域名问题
解决方案
请参考文档:基础能力 / 网络 / 使用说明
网页登录微信小程序管理后台,【管理->开发管理->服务器域名->修改】,添加域名即可。
在这里插入图片描述
微信开发者工具,【详情->项目配置->域名信息】,显示新增的域名说明添加成功。
项目配置

GET和POST请求测试

GET请求的返参作为POST请求的入参

编写JS代码

// index.js
Page({

  /**
   * 页面的初始数据
   */
  data: {
    apiKey: '替换成你的',
    secretKey: '替换成你的',
    accessToken: '', // 用于存储服务器返回的access_token值
    imagePaths: [], // 用于存储图片路径的数组
    imageBase64: '', // 用于存储图片转换成的Base64编码
    imageClassification: {} // 用于存储图像分类结果
  },
  // 假设这是某个事件处理函数,比如按钮点击事件
  handleButtonClick: async function () {
    try {
      // 判断图片转换编码是否为空,为空就直接返回
      if (this.data.imageBase64 === '') {
        console.log('imageBase64 为空');
        return 0
      } else {
        console.log('执行其他操作');
        // 执行其他操作
      }

      // 发起GET请求
      const getResult = await this.getAccessToken();
      console.log('AccessToken请求成功!', getResult.data);

      this.setData({
        accessToken: getResult.data.access_token
      });
      console.log('AccessToken参数值:', this.data.accessToken);

      // // 从GET请求的响应中提取需要的数据
      // const neededData = getResult.data.access_token; // 假设someKey是你需要的字段

      // 使用GET请求的返回值作为POST请求的参数
      const postResult = await this.postImageClassification();
      // 处理POST请求的响应
      console.log('疾病诊断POST请求成功!', postResult.data);
      this.setData({
        imageClassification: postResult.data.results
      });
      console.log('疾病诊断结果:', this.data.imageClassification);

    } catch (error) {
      // 处理错误
      console.error('疾病诊断请求失败:', error);
      // 可以给用户一个错误提示
      // wx.showToast({ title: '请求失败', icon: 'none' });
    }
  },

  // 封装GET请求的函数
  getAccessToken: function () {
    return new Promise((resolve, reject) => {
      wx.request({
        url: `https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=${this.data.apiKey}&client_secret=${this.data.secretKey}`, // GET请求的URL
        method: 'GET',
        success: (res) => {
          if (res.statusCode === 200) {
            resolve(res); // 解析Promise为成功状态,并传递响应数据
          } else {
            reject(new Error(`GET请求失败,状态码:${res.statusCode}`)); // 解析Promise为失败状态,并传递错误信息
          }
        },
        fail: (err) => {
          reject(err); // 网络错误或其他错误时解析Promise为失败状态
        }
      });
    });
  },

  // 封装POST请求的函数
  postImageClassification: function () {
    return new Promise((resolve, reject) => {
      wx.request({
        url: `https://aip.baidubce.com/rpc/2.0/ai_custom/v1/classification/pifubingzhenduan?access_token=${this.data.accessToken}`, // POST请求的URL
        method: 'POST',
        data: {
          image: this.data.imageBase64 // 将GET请求的返回值作为POST请求的参数
        },
        header: {
          'content-type': 'application/json' // 根据需要设置请求头
        },
        success: (res) => {
          if (res.statusCode === 200) {
            resolve(res); // 解析Promise为成功状态,并传递响应数据
          } else {
            reject(new Error(`POST请求失败,状态码:${res.statusCode}`)); // 解析Promise为失败状态,并传递错误信息
          }
        },
        fail: (err) => {
          reject(err); // 网络错误或其他错误时解析Promise为失败状态
        }
      });
    });
  }
})

编写wxml代码

<!-- 诊断 -->
<view class="diagnosis">
  <button bindtap="handleButtonClick">疾病诊断</button>
  <view class="table">
    <block wx:for="{{imageClassification}}" wx:key="index">
      <view class="table-row">
        <view class="table-cell">{{item.name}}</view> 
        <view class="table-cell">{{item.score}}</view>
      </view>
    </block>
  </view>
</view>

编写wxss代码

/* 诊断样式 */
.diagnosis {
  padding: 20px;
}

.table {
  display: flex;
  flex-direction: column;
  width: 100%;
}

.table-row {
  display: flex;
  justify-content: space-between;
  width: 100%;
  margin-bottom: 10px; /* 根据需要调整行间距 */
}

.table-cell {
  flex: 1; /* 使两列平分宽度 */
  padding: 10px; /* 根据需要调整单元格内边距 */
  box-sizing: border-box; /* 确保内边距不影响总宽度 */
  border: 1px solid #ddd; /* 可选:添加边框 */
  text-align: center; /* 可选:文本居中 */
}

效果展示

界面效果

界面效果
识别效果

识别效果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2259905.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

6.2 Postman接口收发包

欢迎大家订阅【软件测试】 专栏&#xff0c;开启你的软件测试学习之旅&#xff01; 文章目录 前言1 接口收发包的类比1.1 获取对方地址&#xff08;填写接口URL&#xff09;1.2 选择快递公司&#xff08;设置HTTP方法&#xff09;1.3 填写快递单&#xff08;设置请求头域&#…

数据链路层(Java)(MAC与IP的区别)

以太网协议&#xff1a; "以太⽹" 不是⼀种具体的⽹络, ⽽是⼀种技术标准; 既包含了数据链路层的内容, 也包含了⼀些物理 层的内容. 例如: 规定了⽹络拓扑结构, 访问控制⽅式, 传输速率等; 例如以太⽹中的⽹线必须使⽤双绞线; 传输速率有10M, 100M, 1000M等; 以太…

SpringBoot2+Vue2开发工作管理系统

项目介绍 在工作中使用的管理系统&#xff0c;可以随手记录一些笔记、可以汇总一些常用网站的链接、可以管理自己负责的项目、可以记录每日日报和查看历史日报、可以记录加班情况、可以记录报销内容、可以编写文章文档。 系统功能 我的笔记快捷入口项目管理今日日报我的日报…

软考中级-软件设计师通过心路经验分享

执念&#xff0c;第四次终于通过了 没买书&#xff0c;下班后每天2小时&#xff0c;四个2个月终于过了 学习经验&#xff1a; 1.下班后学习真的靠毅力&#xff0c;和上学的时候考证不是一个状态&#xff0c;大家要及时调整&#xff0c;否则过程很痛苦 2.失败三次的经验&#xf…

burp(2)利用java安装burpsuite

BurpSuite安装 burpsuite 2024.10专业版&#xff0c;已经内置java环境&#xff0c;可以直接使用&#xff0c; 支持Windows linux macOS&#xff01;&#xff01;&#xff01; 内置jre环境&#xff0c;无需安装java即可使用&#xff01;&#xff01;&#xff01; bp2024.10下载…

el-table 动态计算合并行

原始表格及代码 <el-table:data"tableData"class"myTable"header-row-class-name"tableHead" ><el-table-column prop"date" label"日期"> </el-table-column><el-table-column prop"name" …

【Tomcat】第二站:Tomcat通过反射机制运行项目

目录 前言 1. 动态资源&静态资源 1.1 为什么要区分&#xff1f; 1.2 静态资源 1.3 动态资源 1.4 如何判断 2. Tomcat优先动态 2.1 原因 3. Tomcat运行项目的流程 前言 我们在写项目时&#xff0c;在进行前后端交互时&#xff0c;都会创建一个servlet&#xff0c;然…

vue canvas 绘制选定区域 矩形框

客户那边文档相当的多&#xff0c;目前需要协助其将文档转为数据写入数据库&#xff0c;并与其他系统进行数据共享及建设&#xff0c;所以不得不搞一个识别的功能&#xff0c;用户上传PDF文档后&#xff0c;对于关键信息点进行识别入库&#xff01; 以下为核心代码&#xff0c…

[Pro Git#3] 远程仓库 | ssh key | .gitignore配置

目录 1. 分布式版本控制系统的概念 2. 实际使用中的“中央服务器” 3. 远程仓库的理解 4. 新建远程仓库 5. 克隆远程仓库 6. 设置SSH Key 实验 一、多用户协作与公钥管理 二、克隆后的本地与远程分支对应 三、向远程仓库推送 四、拉取远程仓库更新 五、配置Git忽略…

【Python网络爬虫笔记】11- Xpath精准定位元素

目录 一、Xpath 在 Python 网络爬虫中的作用&#xff08;一&#xff09;精准定位元素&#xff08;二&#xff09;应对动态网页&#xff08;三&#xff09;数据结构化提取 二、Xpath 的常用方法&#xff08;一&#xff09;节点选取&#xff08;二&#xff09;谓词筛选&#xff0…

Spark执行计划解析后是如何触发执行的?

在前一篇Spark SQL 执行计划解析源码分析中&#xff0c;笔者分析了Spark SQL 执行计划的解析&#xff0c;很多文章甚至Spark相关的书籍在讲完执行计划解析之后就开始进入讲解Stage切分和调度Task执行&#xff0c;每个概念之间没有强烈的关联&#xff0c;因此这中间总感觉少了点…

java抽奖系统登录下(四)

6.4 关于登录 最简单的登录&#xff1a; 1、web登录页填写登录信息&#xff0c;前端发送登录信息到后端&#xff1b; 2、后端接受登录信息&#xff0c;并校验。校验成功&#xff0c;返回成功结果。 这种登录会出现一个问题&#xff0c;用户1成功登录之后&#xff0c;获取到后台…

基于米尔全志T527开发板的OpenCV进行手势识别方案

本文将介绍基于米尔电子MYD-LT527开发板&#xff08;米尔基于全志T527开发板&#xff09;的OpenCV手势识别方案测试。 摘自优秀创作者-小火苗 米尔基于全志T527开发板 一、软件环境安装 1.安装OpenCV sudo apt-get install libopencv-dev python3-opencv 2.安装pip sudo apt…

【传感器技术】第6章 压电式传感器,压电材料,压电效应,电压放大器

关注作者了解更多 我的其他CSDN专栏 过程控制系统 工程测试技术 虚拟仪器技术 可编程控制器 工业现场总线 数字图像处理 智能控制 传感器技术 嵌入式系统 复变函数与积分变换 单片机原理 线性代数 大学物理 热工与工程流体力学 数字信号处理 光电融合集成电路…

AI 智能体(AI Agent)到底什么原理?能干什么事情

智能体应用有哪些&#xff1f; 智能体在千行百业中有着广泛的应用&#xff0c;目前已经在 600 多个项目落地和探索&#xff0c;广泛应用于政府与公共事业、交通、工业、能源、金融、医疗、科研等行业。智能体是模拟人类智能的计算机系统&#xff0c;能自主感知环境、智能决策并…

力扣-图论-12【算法学习day.62】

前言 ###我做这类文章一个重要的目的还是给正在学习的大家提供方向和记录学习过程&#xff08;例如想要掌握基础用法&#xff0c;该刷哪些题&#xff1f;&#xff09;我的解析也不会做的非常详细&#xff0c;只会提供思路和一些关键点&#xff0c;力扣上的大佬们的题解质量是非…

智慧政务数据中台建设及运营解决方案

数据中台&#xff1a;政府数字化转型的引擎 数据中台作为政府数字化转型的核心驱动力&#xff0c;起源于美军的作战体系&#xff0c;强调高效、灵活与强大。它不仅促进了政府决策的科学性&#xff0c;还推动了政府服务的精细化与智能化。 数据中台的应用场景&#xff1a;数字…

如何使mysql数据库ID从0开始编号——以BiCorpus为例

BiCorpus是北京语言大学韩林涛老师研制一款在线语料库网站&#xff0c;可以通过上传tmx文件&#xff0c;实现在线检索功能&#xff0c;程序在github上开源免费&#xff0c;深受广大网友的喜欢。 在使用过程中&#xff0c;我发现我上传的语言资产经历修改后&#xff0c;mysql的…

开启第二阶段---蓝桥杯

一、12.10--数据类型的范围及转化 今天是刚开始&#xff0c;一天一道题 对于这道题我想要记录的是Java中的整数默认是 int 类型&#xff0c;如果数值超出了 int 的范围&#xff0c;就会发生溢出错误。为了避免这个问题&#xff0c;可以将数字表示为 long 类型&#xff0c;方法…

使用 Database Tools 实现高效数据查询的十大 IntelliJ IDEA 快捷键

得益于 IntelliJ IDEA Ultimate 的 Database Tools&#xff08;数据库工具&#xff09;中的专用 SQL 查询控制台&#xff0c;您无需离开 IDE 即可轻松修改连接到您的 Java 应用程序的任何数据库中的数据&#xff0c;以及从这些数据库中提取数据。 查询控制台具有 SQL 语句特定的…