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

文章目录

  • 微信小程序字符串
    • 字符串模板
    • 字符串拼接
  • 上传图片
    • 编写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',  // 请求的 URLmethod: 'GET',  // 指定请求方法为 GETheader: {  // 根据服务器要求设置请求头'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请求的URLmethod: '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请求的URLmethod: '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.mzph.cn/news/889192.shtml

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

相关文章

【C#】int? , C# 中的可空类型(Nullable Types)

在 C# 中&#xff0c;问号&#xff08;?&#xff09;用于表示可空类型&#xff08;nullable types&#xff09;。在你的代码中&#xff0c;int? 表示的是可空的整数类型&#xff0c;也就是可以存储 int 类型的值&#xff0c;也可以存储 null。具体来说&#xff1a; int? 详…

[小白系列]Ubuntu安装教程-安装prometheus和Grafana

Docker安装prometheus 拉取镜像 docker pull prom/prometheus 配置文件prometheus.yml 在/data/prometheus/建立prometheus.yml配置文件。&#xff08;/data/prometheus/可根据自己需要调整&#xff09; global:scrape_interval: 15s # By default, scrape targets ev…

在Spring Boot项目中整合Redis:高效数据存储与缓存的最佳实践

目录 1. 引入依赖 2. 创建序列化配置类 2.1 序列化的选择 3. 配置YAML文件 3.1 连接池的配置 4. 使用Redis 4.1 复杂数据类型的存储 4.2 列表、集合和哈希的使用 4.2.1 列表示例 4.2.2 集合示例 4.2.3 哈希示例 5. 处理事务和管道 5.1 事务示例 5.2 管道示例 6…

嵌入式硬件设计 — 智能设备背后的隐形架构大师

目录 引言 一、嵌入式硬件设计概述 &#xff08;一&#xff09;需求分析 &#xff08;二&#xff09;硬件选型 &#xff08;三&#xff09;电路设计 &#xff08;四&#xff09;PCB 制作与焊接 &#xff08;五&#xff09;硬件调试与测试 &#xff08;六&#xff09;软…

调度系统:使用 Airflow 对 Couchbase 执行 SQL 调度时的潜在问题

使用 Airflow 对 Couchbase 执行 SQL 调度时&#xff0c;通常情况下不会直接遇到与 Couchbase 分布式特性相关的异常&#xff0c;但在某些特定情境下&#xff0c;可能会出现一些与分布式环境、调度和数据一致性相关的潜在问题。以下是一些可能会遇到的问题和建议的解决方案&…

[大数据]Hudi编译集成

1. Hudi概述 1.1 Hudi简介 What is Apache Hudi Apache Hudi is the next generation streaming data lake platform. Apache Hudi brings core warehouse and database functionality directly to a data lake. Hudi provides tables, transactions, efficient upserts/dele…

windows下 mysql开启 binlog日志

一、查看是否开启 binlog -- 方式一 show binary logs;-- 方式二 show VARIABLES like log_bin 说明没有开启 方式一 &#xff1a;you are not using binary logging 方式二&#xff1a;log_bin off 二、编辑 my.ini 配置文件 默认安装地点位于&#xff1a;C:\ProgramDat…

本题要求采用选择法排序,将给定的n个整数从大到小排序后输出。

#include <stdio.h> #define MAXN 10 int main() { int i, index, k, n, temp; int a[MAXN]; scanf("%d", &n); for (i 0; i < n; i) { scanf("%d", &a[i]); } // 外层循环控制排序轮数&#xff0c;一共需要n-1轮 for (k 0; k < n…

Vue.js的生命周期

Vue.js 是一个构建用户界面的渐进式框架&#xff0c;它提供了一个响应式和组件化的方式来构建前端应用。了解 Vue 的生命周期对于开发者来说至关重要&#xff0c;因为它可以帮助我们更好地控制组件的状态和行为。本文将详细介绍 Vue 的生命周期&#xff0c;并提供相应的代码示例…

Java-22 深入浅出 MyBatis - 手写ORM框架3 手写SqlSession、Executor 工作原理

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 大数据篇正在更新&#xff01;https://blog.csdn.net/w776341482/category_12713819.html 目前已经更新到了&#xff1a; MyBatis&#xff…

Android 逆向/反编译/Hook修改应用行为 基础实现

前言&#xff1a;本文通过一个简单的情景案例实现安卓逆向的基本操作 一、情景描述 本文通过一个简单的情景案例来实现安卓逆向的基本操作。在这个案例中所使用的项目程序是我自己的Demo程序&#xff0c;不会造成任何的财产侵害&#xff0c;本文仅作为日常记录及案例分享。实…

IDEA创建Spring Boot项目配置阿里云Spring Initializr Server URL【详细教程-轻松学会】

1.首先打开idea选择新建项目 2.选择Spring Boot框架(就是选择Spring Initializr这个) 3.点击中间界面Server URL后面的三个点更换为阿里云的Server URL Idea中默认的Server URL地址&#xff1a;https://start.spring.io/ 修改为阿里云Server URL地址&#xff1a;https://star…

基于MATLAB的信号处理工具:信号分析器

信号&#xff08;或时间序列&#xff09;是与特定时间相关的一系列数字或测量值&#xff0c;不同的行业和学科将这一与时间相关的数字序列称为信号或时间序列。生物医学或电气工程师会将其称为信号&#xff0c;而统计学家或金融定量分析师会使用时间序列这一术语。例如&#xf…

Plugin - 插件开发03_Spring Boot动态插件化与热加载

文章目录 Pre方案概览使用插件的好处流程CodePlugin 定义Plugin 实现Plugin 使用方动态加载插件类加载器注册与卸载插件配置文件启动类测试验证 小结 Pre 插件 - 通过SPI方式实现插件管理 插件 - 一份配置&#xff0c;离插件机制只有一步之遥 插件 - 插件机制触手可及 Plug…

ECharts柱状图-阶梯瀑布图,附视频讲解与代码下载

引言&#xff1a; 在数据可视化的世界里&#xff0c;ECharts凭借其丰富的图表类型和强大的配置能力&#xff0c;成为了众多开发者的首选。今天&#xff0c;我将带大家一起实现一个柱状图图表&#xff0c;通过该图表我们可以直观地展示和分析数据。此外&#xff0c;我还将提供…

【Hash Function and HashMap】

散列函数&#xff08;Hash Function&#xff09;是一种将任意大小的数据映射到固定大小值的函数。在 HashMap 中&#xff0c;它扮演着核心角色。让我详细解释&#xff1a; 散列函数基本原理 输入&#xff1a;任意类型的键&#xff08;key&#xff09;输出&#xff1a;固定大小…

【jvm】为什么要有GC

目录 1. 自动内存管理2. 提升程序稳定性3. 优化性能4. 跨平台能力5. 分代回收策略 1. 自动内存管理 1.JVM中的GC机制负责自动管理内存&#xff0c;这意味着开发人员不需要手动分配和释放内存。2.这一特性大大简化了Java程序的内存管理&#xff0c;降低了内存泄漏和内存溢出等问…

Python泛型编程:TypeVar和Generic详解 - 写给初学者的指南

Python泛型编程&#xff1a;TypeVar和Generic详解 - 写给初学者的指南 前言1. 为什么需要泛型&#xff1f;2. TypeVar&#xff1a;定义泛型类型变量3. Generic&#xff1a;创建泛型类4. 多个泛型类型变量5. 使用场景小结结语 前言 大家好&#xff01;今天我们来聊一聊Python中…

COUNT(*)、COUNT(1)、COUNT(某一列)的区别是什么?哪个性能更好

一些特殊情况&#xff1a; 有索引时&#xff1a;如果查询使用了索引&#xff0c;且查询的列在索引中&#xff0c;COUNT(某一列) 可能在某些情况下会比较快&#xff0c;因为数据库只需要扫描索引&#xff0c;而不需要扫描整个表。有 NULL 值时&#xff1a;COUNT(某一列) 可能会…

C/C++流星雨

系列文章 序号直达链接1C/C爱心代码2C/C跳动的爱心3C/C李峋同款跳动的爱心代码4C/C满屏飘字表白代码5C/C大雪纷飞代码6C/C烟花代码7C/C黑客帝国同款字母雨8C/C樱花树代码9C/C奥特曼代码10C/C精美圣诞树11C/C俄罗斯方块12C/C贪吃蛇13C/C孤单又灿烂的神-鬼怪14C/C闪烁的爱心15C/C…