解锁豆瓣高清海报(二) 使用 OpenCV 拼接和压缩
解锁豆瓣高清海报(二): 使用 OpenCV 拼接和压缩
脚本地址:
项目地址: Gazer
PixelWeaver.py
pixel_squeezer_cv2.py
前瞻
继上一篇“解锁豆瓣高清海报(一) 深度爬虫与requests进阶之路”成功爬取豆瓣电影海报之后,本文将介绍如何使用 OpenCV 对这些海报进行智能拼接和压缩。我们将开发两个实用的 Python 脚本:PixelWeaver.py 和 pixel_squeezer_cv2.py,前者可以根据指定的行列数和目标尺寸,智能地裁剪、调整并拼接多张图片,实现近似无损的拼接效果;后者则可以将大型图片压缩到指定大小,同时尽可能地保持图片质量。这两个脚本也可以作为通用的图片拼接/压缩工具使用。
使用方法
- 克隆或下载项目代码。
- 安装依赖:
pip install opencv-python numpy,或者克隆项目代码后pip install -r requirements.txt
PixelWeaver.py
- 指定
image_dirs,保存的图片文件夹路径, 支持填写多个文件夹。 - 指定
output_path保存路径, 一定要写文件名, 如r"E:\Gazer\DoubanGaze\data\poster\movie_2022.jpg"。 - 设置拼接的行和列
rows和cols。 - 设置目标尺寸/分辨率(px)
target_size。
可选参数
- 按照日期顺序排列:
filenames.sort(key=extract_date, reverse=True)改为filenames.sort(key=extract_date, reverse=False) - 指定正则表达式:
re.search(r"(\d{4}_\d{2}_\d{2})", filename) # 匹配2024_12_30, 不匹配的文件会按照文件名顺序排在后面
pixel_squeezer_cv2.py
- 指定
image_dirs,输入图片路径 - 指定
output_path保存路径, 一定要写文件名, 如r"E:\Gazer\DoubanGaze\data\poster\movie_2022_compressed.jpg" - 指定压缩到多大和最大宽度
target_size_mb=10max_width=1600, 这里目标大小为 10MB 以下, 最大宽度为1600
可选参数
-
质量参数可选 0 到 100(包含 0 和 100)
quality = 100说明
经过测试, 合成图大小为 115MB, jpg 格式,quality = 100可以压缩到 5.28MB. 所以脚本里默认是 100 了.
PixelWeaver.py
代码结构
process_image处理单张图片,进行智能裁剪或调整 (OpenCV)extract_date从文件名中提取日期,用于排序 (regex)process_all_images处理目录下的所有图片,返回处理后的图片列表create_collage拼接海报并输出
说明和测试结果
上一篇中提到了仍有可能碰到 418 错误导致不能成功保存图片, 故建议按照日志中的链接保存图片并规范命名(只要以日期形式如 2024_12_31 开头即可), 以保证这个脚本中的正则表达式能愉快工作.
关于设置目标尺寸 target_size, 可以观察爬取的图片的分辨率, 我测试之后使用的数据是 1080 × 1600. 过大的图片会根据中心位置裁剪, 过小的图片使用插值缩放.

输入图片数量不足以填满拼接网格的处理
当输入的图片数量无法填满 rows * cols 的拼接网格时,create_collage 函数会在空白位置填充黑色。为了避免程序出错, 修改后的代码会在计算 row 或 col 超出预设范围时,自动停止放置图片, 不会尝试访问不存在的图片元素。
原始的 create_collage 函数的核心循环部分:
for i in range(num_images):row = i // colscol = i % colsx = col * target_wy = row * target_hcollage[y:y+target_h, x:x+target_w] = processed_images[i]
这段代码的逻辑是:依次取出 processed_images 列表中的每一张图片,计算它应该放置的行列位置 (row, col) 和坐标 (x, y),然后将图片复制到 collage 画布的相应位置。
问题出在哪里呢?
在拼接图片的过程中,如果遇到图片数量 num_images 少于预设的行列数 rows * cols 的情况,原始的代码逻辑可能会导致程序尝试访问 processed_images 列表中不存在的元素,从而引发错误。
为了解决这个问题,修改代码逻辑,加入安全检查机制。
这是修改后的代码:
for i in range(num_images):row = i // colscol = i % colsif row >= rows or col >= cols:break # 超出预设的行列范围,停止放置图片x = col * target_wy = row * target_hcollage[y:y+target_h, x:x+target_w] = processed_images[i]
关键在于这行代码:
if row >= rows or col >= cols:break # 超出预设的行列范围,停止放置图片
它的作用是:在每次循环迭代中,除了根据 i 计算当前图片的 row 和 col 之外,还增加了一个额外的判断:如果计算出来的 row 大于等于预设的 rows,或者 col 大于等于预设的 cols,就立即跳出循环,不再继续放置图片,并结束循环。这确保了循环不会尝试访问 processed_images 列表中不存在的元素,也不会在 collage 画布的错误位置放置图片。
为什么这样可以解决问题?
因为 for i in range(num_images) 循环只会执行 num_images 次,并且 row 和 col 是基于 i 计算得出的,而 if row >= rows or col >= cols: break 这行代码可以确保,即使 num_images 小于 rows * cols,循环也不会尝试访问不存在的图片元素或在超出预设行列范围的位置放置图片。即使 num_images 小于 rows * cols,循环也会在 num_images 次之内结束, 提前结束循环, 避免访问不存在的元素或者在错误位置放置图片。
让我们通过一个例子来说明:
rows= 3 (预设 3 行)cols= 3 (预设 3 列)rows * cols= 9 (总共 9 个格子)num_images= 7 (实际只有 7 张图片)
在这种情况下,for 循环会执行 7 次 (因为 num_images 是 7),i 的值依次为 0, 1, 2, 3, 4, 5, 6。
当 i 循环到 6 的时候 (放置第 7 张图片):
row= 6 // 3 = 2col= 6 % 3 = 0row(2) 小于rows(3),col(0) 小于cols(3),所以会放置第 7 张图片 (processed_images[6])
当循环结束时, 不会计算 i=7 时的 row 和 col 了. 因为 num_images 是 7, 所以 for i in range(num_images) 最后一次循环 i 的值是 6.
由于循环在 i=6 时结束, 因此循环不会尝试访问 processed_images[7], 也不会计算 i=7 时的 row 和 col。
这样,即使只有 7 张图片,程序也不会出错,并且会正确地将 7 张图片放置到 collage 画布的前 7 个格子上,剩下的格子将保持空白(在代码中看起来是黑色,因为 collage 初始化为黑色背景)。
总结一下,if row >= rows or col >= cols: break 这行代码在这里起到了一个额外的保护作用。它确保了在 num_images 小于 rows * cols 的情况下,循环不会尝试访问不存在的图片元素或在超出预设行列范围的位置放置图片,从而避免了程序出错。即使我们确定 num_images 小于 rows * cols,这行代码也能增强程序的健壮性,使其能够处理更多不同的情况,并使代码的逻辑更加清晰。
近似无损拼接
PixelWeaver.py 脚本在拼接图片时,通过精心的裁剪和缩放策略,以及高质量的插值算法 (cv2.INTER_AREA 用于缩小, cv2.INTER_CUBIC 用于放大), 尽可能地保留了原始图片的细节, 实现了肉眼难以察觉损失的近似无损拼接。即使是 110 张海报拼接成一张大图,最终的图片质量依然非常出色。
原因:
- 图片处理过程(
process_image函数):-
在这个脚本中,每张图片都会经过
process_image函数的处理。这个函数主要做了两件事:- 裁剪: 当图片尺寸大于目标尺寸时,会裁剪图片中心区域。
- 缩放: 当图片尺寸不等于目标尺寸时, 会进行缩放, 确保所有图片尺寸一致。
-
裁剪操作本身就是一种有损操作。因为它会直接丢弃图片边缘的部分像素信息。
-
缩放操作虽然理论上有可能造成图像信息的损失, 但是, 如果使用高质量的插值算法, 可以将损失控制在肉眼几乎无法察觉的范围内.
-
- 拼接过程 (
create_collage函数):- 拼接过程本身并不会对图片数据进行修改, 可以看作是无损的. 它只是将所有图片数据按顺序拷贝到一张大的画布上。
- 图片保存 (
cv2.imwrite函数):cv2.imwrite()函数在保存图片时, 会根据你指定的文件格式 (例如.jpg,.png) 进行编码压缩.- 如果保存为
.jpg格式,那么这肯定是一个有损压缩的过程。JPEG 格式是一种有损压缩的图片格式,它通过牺牲一定的图片质量来换取较小的文件体积。 - 如果保存为
.png格式,那么可以认为是无损压缩, 或者损失极小。 PNG 格式是一种无损压缩的图片格式,它可以保留图片的原始信息,但文件体积通常比 JPEG 格式大.
所以, 110张海报拼接后得到59.2MB, 并且感觉质量特别棒, 这也印证了我们上面的分析. 因为之前使用的是 .jpg 格式来保存的, 所以图片有压缩, 但是这个压缩带来的损失, 从观感上来说, 是很小的, 几乎无法察觉.
插值算法的功劳:
如果要说哪个算法起到了最大的作用,那应该是在缩放操作中使用的 插值算法。
在代码中,有两种情况会进行缩放:
-
图片尺寸大于目标尺寸,裁剪后如果尺寸仍然和目标尺寸不同, 则进行缩放:
if (cropped_img.shape[1] != target_w) or (cropped_img.shape[0] != target_h) :cropped_img = cv2.resize(cropped_img, target_size, interpolation = cv2.INTER_AREA)这里使用了
cv2.INTER_AREA插值算法。 -
图片尺寸小于目标尺寸:
resized_img = cv2.resize(img, target_size, interpolation = cv2.INTER_CUBIC) # 使用 cv2.INTER_CUBIC这里使用了
cv2.INTER_CUBIC插值算法。
cv2.INTER_AREA: 基于局部像素的区域重采样。它适用于缩小图像。这个算法在进行图片缩小的时候, 能较好地保留图片的质量和细节.cv2.INTER_CUBIC: 基于 4x4 像素邻域的立方插值。它适用于放大图像。这个算法在图片放大的时候, 能获得一个相对平滑和清晰的结果.
这两个插值算法在 OpenCV 中都属于高质量的插值算法,能够在缩放过程中最大程度地保留图像的细节,减少失真。 因此,即使图片经过了缩放,最终的拼接结果仍然能够保持很好的质量。
process_image 函数详解
process_image 函数负责处理每一张输入图片,它的主要任务是根据目标尺寸 (target_size) 对图片进行智能裁剪或调整。
裁剪策略:
当图片尺寸大于目标尺寸时,为了尽可能保留图片的关键信息,process_image 会裁剪图片的中心区域。这是因为大多数海报的主体内容通常位于图片的中心位置。
缩放策略:
为了保证所有图片都能无缝拼接,process_image 会将所有图片都调整到相同的尺寸 (target_size)。在缩放过程中,根据不同的情况选择不同的插值算法:
# 代码摘自 PixelWeaver.py 的 process_image 函数
if (img.shape[1] target_w) or (img.shape[0] target_h):# 裁剪图片中心区域# ...if (cropped_img.shape[1] != target_w) or (cropped_img.shape[0] != target_h) :cropped_img = cv2.resize(cropped_img, target_size, interpolation = cv2.INTER_AREA) # 使用 cv2.INTER_AREA 进行缩小
elif (img.shape[1] != target_w) or (img.shape[0] != target_h):# 缩放图片以匹配目标尺寸resized_img = cv2.resize(img, target_size, interpolation = cv2.INTER_CUBIC) # 使用 cv2.INTER_CUBIC 进行放大
问题来了, 115MB 的图无法分享和上传到网上了, 所以还是使用pixel_squeezer_cv2.py压缩一下吧.
pixel_squeezer_cv2.py
说明和测试结果
使用 OpenCV 压缩 JPEG 图片的参数主要是 cv2.IMWRITE_JPEG_QUALITY,它的范围是 0-100,数值越小,压缩率越高,图片质量越差。
因为不同的图片内容(例如纹理复杂程度、颜色丰富程度)对压缩的敏感度不同。 有些图片可能压缩到 quality=40 还能接受,有些可能到 quality=50 就已经出现明显的失真了。
压缩效果示例 (压缩后为 5.28MB ):
海报压缩效果.jpg
compress_image_cv2 函数详解
compress_image_cv2 函数负责将图片压缩到指定大小 (MB) 以下,同时尽可能地保持图片质量。它接受以下几个关键参数:
target_size_mb: 目标文件大小,单位为 MB。max_width: 图片的最大宽度。如果图片的宽度超过这个值,将会被等比例缩小。max_height: 图片的最大高度。如果图片的高度超过这个值,将会被等比例缩小。
工作原理:
compress_image_cv2 函数使用一个 while 循环来不断尝试不同的 JPEG 压缩质量 (quality),直到压缩后的文件大小小于等于 target_size_mb。
quality = 75 # 初始质量值
while True:# ...cv2.imwrite(temp_output_path, image, [cv2.IMWRITE_JPEG_QUALITY, quality]) # 使用当前 quality 值保存图片file_size_mb = os.path.getsize(temp_output_path) / (1024 * 1024) # 获取文件大小print(f"Quality: {quality}, Size: {file_size_mb:.2f} MB")if file_size_mb <= target_size_mb:# 文件大小已满足要求,跳出循环breakelif quality <= 5:# 质量已降至最低,仍然无法满足要求,发出警告并跳出循环print("警告:质量已降至极低,可能无法满足目标大小。")breakelse:quality -= 5 # 降低 quality 值,继续尝试
代码解释:
- 函数首先根据
max_width和max_height参数调整图片的尺寸。 - 然后,它从初始的
quality值 (默认为 75) 开始,在一个while循环中不断尝试压缩图片。 - 每次循环中,它使用当前的
quality值将图片保存为一个临时文件,并获取临时文件的大小。 - 如果文件大小小于等于
target_size_mb,则说明压缩成功,函数将临时文件重命名为最终的输出文件,并跳出循环。 - 如果文件大小仍然大于
target_size_mb,并且quality值已经降至 5 或以下,则说明无法在保持可接受质量的前提下将图片压缩到目标大小,函数会发出警告,并将当前质量下的临时文件作为最终输出。 - 否则,函数会将
quality值降低 5,并继续循环尝试。
环中,它使用当前的quality值将图片保存为一个临时文件,并获取临时文件的大小。 - 如果文件大小小于等于
target_size_mb,则说明压缩成功,函数将临时文件重命名为最终的输出文件,并跳出循环。 - 如果文件大小仍然大于
target_size_mb,并且quality值已经降至 5 或以下,则说明无法在保持可接受质量的前提下将图片压缩到目标大小,函数会发出警告,并将当前质量下的临时文件作为最终输出。 - 否则,函数会将
quality值降低 5,并继续循环尝试。
相关文章:
解锁豆瓣高清海报(二) 使用 OpenCV 拼接和压缩
解锁豆瓣高清海报(二): 使用 OpenCV 拼接和压缩 脚本地址: 项目地址: Gazer PixelWeaver.py pixel_squeezer_cv2.py 前瞻 继上一篇“解锁豆瓣高清海报(一) 深度爬虫与requests进阶之路”成功爬取豆瓣电影海报之后,本文将介绍如何使用 OpenCV 对这些海报进行智…...
我用Ai学Android Jetpack Compose之Card
这篇学习一下Card。回答来自 通义千问。 我想学习Card,麻烦你介绍一下 当然可以!在 Jetpack Compose 中,Card 是一个非常常用的组件,用于创建带有阴影和圆角的卡片式布局。它可以帮助你轻松实现美观且一致的 UI 设计,…...
NLP深度学习 DAY4:Word2Vec详解:两种模式(CBOW与Skip-gram)
用稀疏向量表示文本,即所谓的词袋模型在 NLP 有着悠久的历史。正如上文中介绍的,早在 2001年就开始使用密集向量表示词或词嵌入。Mikolov等人在2013年提出的创新技术是通过去除隐藏层,逼近目标,进而使这些单词嵌入的训练更加高效。…...
论文阅读(十):用可分解图模型模拟连锁不平衡
1.论文链接:Modeling Linkage Disequilibrium with Decomposable Graphical Models 摘要: 本章介绍了使用可分解的图形模型(DGMs)表示遗传数据,或连锁不平衡(LD),各种下游应用程序之…...
Python中容器类型的数据(上)
若我们想将多个数据打包并且统一管理,应该怎么办? Python内置的数据类型如序列(列表、元组等)、集合和字典等可以容纳多项数据,我们称它们为容器类型的数据。 序列 序列 (sequence) 是一种可迭代的、元素有序的容器类型的数据。 序列包括列表 (list)…...
PySPARK带多组参数和标签的SparkSQL批量数据导出到S3的程序
设计一个基于多个带标签SparkSQL模板作为配置文件和多组参数的PySPARK代码程序,实现根据不同的输入参数自动批量地将数据导出为Parquet、CSV和Excel文件到S3上,标签和多个参数(以“_”分割)为组成导出数据文件名,文件已…...
蓝桥杯备考:模拟算法之字符串展开
P1098 [NOIP 2007 提高组] 字符串的展开 - 洛谷 | 计算机科学教育新生态 #include <iostream> #include <cctype> #include <algorithm> using namespace std; int p1,p2,p3; string s,ret; void add(char left,char right) {string tmp;for(char ch left1;…...
使用LLaMA-Factory对AI进行认知的微调
使用LLaMA-Factory对AI进行认知的微调 引言1. 安装LLaMA-Factory1.1. 克隆仓库1.2. 创建虚拟环境1.3. 安装LLaMA-Factory1.4. 验证 2. 准备数据2.1. 创建数据集2.2. 更新数据集信息 3. 启动LLaMA-Factory4. 进行微调4.1. 设置模型4.2. 预览数据集4.3. 设置学习率等参数4.4. 预览…...
@Nullable 注解
文章目录 解释 Nullable 注解注解的组成部分:如何使用 Nullable 注解a. 标注方法返回值:b. 标注方法参数:c. 标注字段: 结合其他工具与 Nonnull 配合使用总结 Nullable 注解在 Java 中的使用场景通常与 Nullability(空…...
Arduino大师练成手册 -- 控制 AS608 指纹识别模块
要在 Arduino 上控制 AS608 指纹识别模块,你可以按照以下步骤进行: 硬件连接 连接指纹模块:将 AS608 指纹模块与 Arduino 连接。通常,AS608 使用 UART 接口进行通信。你需要将 AS608 的 TX、RX、VCC 和 GND 引脚分别连接到 Ardu…...
Mask R-CNN与YOLOv8的区别
Mask R-CNN与YOLOv8虽然都是深度学习在计算机视觉领域的应用,但它们属于不同类型的视觉框架,各有特点和优势。 以下是关于 Mask R-CNN 和 YOLOv8 的详细对比分析,涵盖核心原理、性能差异、应用场景和选择建议: 1. 核心原理与功能…...
在Ubuntu上使用Docker部署DeepSeek
在Ubuntu上使用Docker部署DeepSeek,并确保其可以访问公网网址进行对话,可以按照以下步骤进行: 一、安装Docker 更新Ubuntu的软件包索引: sudo apt-get update安装必要的软件包,这些软件包允许apt通过HTTPS使用存储库…...
MySQL的覆盖索引
MySQL的覆盖索引 前言 当一个索引包含了查询所需的全部字段时,就可以提高查询效率,这样的索引又被称之为覆盖索引。 以MySQL常见的三种存储引擎为例:InnoDB、MyISAM、Memory,对于覆盖索引提高查询效率的方式均不同,…...
【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】2.12 连续数组:为什么contiguous这么重要?
2.12 连续数组:为什么contiguous这么重要? 目录 #mermaid-svg-wxhozKbHdFIldAkj {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-wxhozKbHdFIldAkj .error-icon{fill:#552222;}#mermaid-svg-…...
在React中使用redux
一、首先安装两个插件 1.Redux Toolkit 2.react-redux 第一步:创建模块counterStore 第二步:在store的入口文件进行子模块的导入组合 第三步:在index.js中进行store的全局注入 第四步:在组件中进行使用 第五步:在组件中…...
lstm预测
import numpy as np import pandas as pd import tensorflow as tf import math import matplotlib.pyplot as plt from sklearn.preprocessing import MinMaxScaler from keras.layers import LSTM,Activation,Dense,Dropout# 时间序列数据转换为监督学习的格式 def creatXY(d…...
《 C++ 点滴漫谈: 二十五 》空指针,隐秘而危险的杀手:程序崩溃的真凶就在你眼前!
摘要 本博客全面解析了 C 中指针与空值的相关知识,从基础概念到现代 C 的改进展开,涵盖了空指针的定义、表示方式、使用场景以及常见注意事项。同时,深入探讨了 nullptr 的引入及智能指针在提升代码安全性和简化内存管理方面的优势。通过实际…...
【AI】探索自然语言处理(NLP):从基础到前沿技术及代码实践
Hi ! 云边有个稻草人-CSDN博客 必须有为成功付出代价的决心,然后想办法付出这个代价。 目录 引言 1. 什么是自然语言处理(NLP)? 2. NLP的基础技术 2.1 词袋模型(Bag-of-Words,BoWÿ…...
2025年Android开发趋势全景解读
文章目录 一、界面开发:从"手写代码"到"智能拼装"1.1 Jetpack Compose实战进化1.2 淘汰XML布局的三大信号 二、AI融合开发:无需炼丹的普惠智能2.1 设备端AI三大杀手级应用2.2 成本对比:设备端VS云端AI 三、跨平台演进&am…...
C#面试常考随笔11:Dictionary<K, V>、Hashtable的内部实现原理是什么?效率如何?
Dictionary<K, V> 底层数据结构:使用哈希表(Hash Table),由一个数组和链表(或在.NET Core 2.1 及之后版本中,当链表长度达到一定阈值时转换为红黑树)组成。数组中的每个元素称为一个桶&a…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)
HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...
51c自动驾驶~合集58
我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留,CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制(CCA-Attention),…...
三维GIS开发cesium智慧地铁教程(5)Cesium相机控制
一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点: 路径验证:确保相对路径.…...
Golang dig框架与GraphQL的完美结合
将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用,可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器,能够帮助开发者更好地管理复杂的依赖关系,而 GraphQL 则是一种用于 API 的查询语言,能够提…...
376. Wiggle Subsequence
376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...
MMaDA: Multimodal Large Diffusion Language Models
CODE : https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA,它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构…...
什么是EULA和DPA
文章目录 EULA(End User License Agreement)DPA(Data Protection Agreement)一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA(End User License Agreement) 定义: EULA即…...
mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包
文章目录 现象:mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时,可能是因为以下几个原因:1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...
【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)
1.获取 authorizationCode: 2.利用 authorizationCode 获取 accessToken:文档中心 3.获取手机:文档中心 4.获取昵称头像:文档中心 首先创建 request 若要获取手机号,scope必填 phone,permissions 必填 …...
Springboot社区养老保险系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,社区养老保险系统小程序被用户普遍使用,为方…...
