【HarmonyOS 5】鸿蒙用户头像编辑功能实践
【HarmonyOS 5】鸿蒙用户头像编辑功能实践
一、前言
1、应用背景
在鸿蒙化开发过程中,我们发现最基本常见的功能–用户头像的编辑,实现方式和Android与IOS有极大的不同。
在实际开发和调研的过程中,我们发现并总结了鸿蒙隐私处理与业内Android和IOS的差异性。发现隐私保护对标其他两个,上升了一个大台阶。并且针对开发者来说,也更加人性化,便利化。
2、业务需求拆解
用户头像编辑功能流程图如下所示:
(1) 用户首先触发头像编辑功能(如用户点击 “编辑头像” 按钮)。
(2) 用户打开设备相册,选择目标图片
此时会获取用户选择的图片,可能没有选择,用户取消,或者用户没有给权限。
(3) 手势裁剪图片:
进入裁剪界面,支持手势缩放、拖动、旋转图片,划定裁剪区域。
(4) 上传图片至服务器:
裁剪完成后,将图片压缩并上传至服务器,等待返回成功响应。
(5) 更新头像显示
3、技术调研目标
经过完整的需求拆解,实际需要调研的功能点只有三个:
(1)鸿蒙中如何获取用户的图片
(2)鸿蒙中如何实现图片的裁剪
(3)鸿蒙中如何实现图片的手势操控
二、用户相册图片获取的三种方式
1、用户相册图片获取功能的行业技术路线方案对比:
在鸿蒙调研过程中,我们发现,相当于Android和IOS的获取用户相册图片的方式,鸿蒙大有不同。
目前Android获取用户相册图片的技术路线有:
(1)调用系统原生相册,选取图片后传递给三方应用进行图片处理。隐式 Intent 调用系统相册或者SAF(Storage Access Framework )。
(2)申请用户相册权限,获取用户相册内所有的图片,在三方应用自定义的相册界面进行展示和图片选择逻辑。MediaStore 直接查询系统相册。
目前IOS获取用户相册图片的技术路线有:
(1)通过系统提供的控制器直接调用相册,UIImagePickerController(快速选择)
(2)申请用户相册权限,获取用户相册内所有的图片,在三方应用自定义的相册界面进行展示和图片选择逻辑。通过 PHPhotoLibrary 框架直接访问相册数据库。
当然Android和IOS集成三方SDK也可实现获取用户相册图片,但是其实最终原理还是以上,所以不单独列出。
目前在鸿蒙中对于用户图片的获取有以下三种方式:
(1)需要三方应用申请受限权限,获取文件读写的权限,(调用需要ohos.permission.READ_IMAGEVIDEO权限),这样就可以读取相册媒体库中的媒体资源。
(2)通过鸿蒙系统提供的安全控件PhotoAccessHelper,用户触发操作后即表示同意授权,不需要三方应用再去授权,可以将图片临时授权给应用处理。
(3)针对高度定制化三方应用的需求,不希望相册界面使用系统组件,保持APP的美观和一致性。鸿蒙提供了AlbumPicker,开发者可以在布局中嵌入AlbumPickerComponent组件,通过此组件,应用无需申请权限,即可访问公共目录中的相册列表。
2、用户相册图片获取功能的技术选项
综上所述,我们可以对比发现。鸿蒙在针对用户隐私保护上,比Android和IOS做的都好。极大的保护了用户的隐私安全。
虽然IOS使用系统控制器的方式也可达到鸿蒙的效果,但是市面上既有的APP几乎都是采用,先进入自己应用的相册,然后调用控制器,逻辑操作繁琐,并且很多APP没有在自己的应用相册界面中添加触发【+】加号入口。目前微信是有做,像饿了么京东都没做。需要去系统设置中自己手动添加可以访问的图片给应用。
说实话,我在使用IOS手机时,就喜欢权限设置里带的访问选择图片功能。不像安卓一样,获取用户授权后,APP就能访问到用户相册所有的图片。而是用户勾选开发给APP的图片,APP只能访问这些。这是IOS的做法。当然IOS也保留了,和Android类似的所有图片开放权限。
获取相册所有图片,是开发者最常见的操作了,目前华为是不提倡APP访问用户所有相册资源。鸿蒙的隐私保护效果好,但是对于开发者就有点痛苦了,特别是产品的要求要与Android和IOS一致的情况下。
DEMO验证阶段我们发现,鸿蒙方案一,申请读取权限,该权限是管制权限,需要三方应用去通过场景申请,非常严格并且几乎无法申请通过。【申请使用受限权限】 所以PASS。
"requestPermissions": [{"name": "ohos.permission.READ_IMAGEVIDEO","usedScene": {"abilities": ["EntryAbility"],"when": "inuse"},"reason": "$string:CAMERA"}
]
// 创建申请权限明细async reqPermissionsFromUser(): Promise<number[]> {let context = getContext() as common.UIAbilityContext;let atManager = abilityAccessCtrl.createAtManager();let grantStatus = await atManager.requestPermissionsFromUser(context, ['ohos.permission.READ_IMAGEVIDEO']);return grantStatus.authResults;}// 用户申请权限async requestPermission() {let grantStatus = await this.reqPermissionsFromUser();for (let i = 0; i < grantStatus.length; i++) {if (grantStatus[i] === 0) {// 用户授权,可以继续访问目标操作}}}
鸿蒙方案二在930阶段启用,使用也很方便,虽然损失了APP的美观和一致性。使用系统提供的Picker组件,以弹框的形式显示,让用户选择图片,点击完成后,自动收起。效果如下图所示:
/*** 相册选择图片*/
private async getPictureFromAlbum() {// 创建一个 PhotoSelectOptions 对象,用于配置相册选择的相关选项let PhotoSelectOptions = new photoAccessHelper.PhotoSelectOptions();// 设置选择的文件 MIME 类型为图片类型,这样在相册选择时只会显示图片文件PhotoSelectOptions.MIMEType = photoAccessHelper.PhotoViewMIMETypes.IMAGE_TYPE;// 设置最大选择数量为 1,即只能从相册中选择一张图片PhotoSelectOptions.maxSelectNumber = 1;// 设置推荐选项,这里指定推荐类型为二维码或条形码,可能会优先展示符合此类型的图片PhotoSelectOptions.recommendationOptions = {recommendationType: photoAccessHelper.RecommendationType.QR_OR_BAR_CODE}// 创建一个 PhotoViewPicker 对象,用于启动相册选择器let photoPicker = new photoAccessHelper.PhotoViewPicker();// 调用 select 方法,传入配置好的选项,等待用户从相册中选择图片// 返回一个 PhotoSelectResult 对象,包含用户选择的图片的相关信息let photoSelectResult: photoAccessHelper.PhotoSelectResult = await photoPicker.select(PhotoSelectOptions);// 从 PhotoSelectResult 对象中获取用户选择的第一张图片的 URI 路径let albumPath = photoSelectResult.photoUris[0];// 在控制台输出日志,记录获取到的图片路径,方便调试和查看信息console.info(this.TAG, 'getPictureFromAlbum albumPath= ' + albumPath);// 调用 getImageByPath 方法,传入图片路径,用于根据路径获取图片的具体内容await this.getImageByPath(albumPath);
}
方案三是今年系统API升级后公开提供的API,从应用市场下载APP操作对比,使用上看应该是去年给大厂APP,微信微博他们先使用后,才公开的方案。我是比较推荐该方案,搞定定制化,符合APP的整体调性。效果如下图所示:
// 从 @ohos.file.PhotoPickerComponent 模块导入所需的类和类型
// 这些类和类型用于构建和配置图片选择器组件
import {PhotoPickerComponent, // 图片选择器组件类PickerController, // 图片选择器控制器类,用于控制组件行为PickerOptions, // 图片选择器的配置选项类DataType, // 数据类型枚举BaseItemInfo, // 基础项信息类ItemInfo, // 项信息类,包含更详细的项信息PhotoBrowserInfo, // 图片浏览器信息类ItemType, // 项类型枚举ClickType, // 点击类型枚举MaxCountType, // 最大数量类型枚举PhotoBrowserRange, // 图片浏览器范围枚举ReminderMode, // 提醒模式枚举
} from '@ohos.file.PhotoPickerComponent';
// 导入照片访问辅助工具模块
import photoAccessHelper from '@ohos.file.photoAccessHelper';// 标记为页面入口组件
// 定义一个名为 AlbumTestPage 的组件
struct AlbumTestPage {// 组件初始化时设置参数信息// 创建一个 PickerOptions 实例,用于配置图片选择器的各种选项pickerOptions: PickerOptions = new PickerOptions();// 组件初始化完成后,可控制组件部分行为// 使用 @State 装饰器,使 pickerController 成为响应式状态变量// 创建一个 PickerController 实例,用于控制图片选择器的行为 pickerController: PickerController = new PickerController();// 已选择的图片// 使用 @State 装饰器,使 selectUris 成为响应式状态变量// 用于存储已选择图片的 URI 数组 selectUris: Array<string> = new Array<string>();// 目前选择的图片// 使用 @State 装饰器,使 currentUri 成为响应式状态变量// 用于存储当前选中图片的 URI currentUri: string = '';// 是否显示大图// 使用 @State 装饰器,使 isBrowserShow 成为响应式状态变量// 用于控制是否显示图片浏览器(大图模式) isBrowserShow: boolean = false;// 组件即将显示时调用的生命周期函数aboutToAppear() {// 设置 picker 宫格页数据类型// 将选择器的 MIME 类型设置为图片和视频类型,即图片和视频都会在选择器中显示this.pickerOptions.MIMEType = photoAccessHelper.PhotoViewMIMETypes.IMAGE_VIDEO_TYPE; // 最大选择数量// 设置图片选择的最大数量为 5 张this.pickerOptions.maxSelectNumber = 5;// 超出最大选择数量时// 当选择数量超过最大限制时,以 Toast 形式提醒用户this.pickerOptions.maxSelectedReminderMode = ReminderMode.TOAST;// 是否展示搜索框,默认 false// 开启选择器中的搜索框功能this.pickerOptions.isSearchSupported = true;// 是否支持拍照,默认 false// 开启选择器中的拍照功能this.pickerOptions.isPhotoTakingSupported = true;}// 资源被选中回调,返回资源的信息,以及选中方式// 当图片选择器中的项被点击时触发的回调函数private onItemClicked(itemInfo: ItemInfo, clickType: ClickType): boolean {// 若传入的项信息为空,则直接返回 falseif (!itemInfo) {return false;}// 获取项的类型let type: ItemType | undefined = itemInfo.itemType;// 获取项的 URIlet uri: string | undefined = itemInfo.uri;// 若项类型为相机if (type === ItemType.CAMERA) {// 点击相机 item// 返回 true 则拉起系统相机,若应用需要自行处理则返回 falsereturn true; } else {// 若点击类型为选中if (clickType === ClickType.SELECTED) {// 应用做自己的业务处理if (uri) {// 将选中图片的 URI 添加到已选择数组中this.selectUris.push(uri);// 更新选择器的预选中 URI 数组this.pickerOptions.preselectedUris = [...this.selectUris];}// 返回 true 则勾选,否则则不响应勾选return true; } else {if (uri) {// 若点击类型为取消选中,从已选择数组中过滤掉该 URIthis.selectUris = this.selectUris.filter((item: string) => {return item != uri;});// 更新选择器的预选中 URI 数组this.pickerOptions.preselectedUris = [...this.selectUris];}}return true;}}// 进入大图的回调// 当进入图片浏览器(大图模式)时触发的回调函数private onEnterPhotoBrowser(photoBrowserInfo: PhotoBrowserInfo): boolean {// 设置显示大图标志为 truethis.isBrowserShow = true;return true;}// 退出大图的回调// 当退出图片浏览器(大图模式)时触发的回调函数private onExitPhotoBrowser(photoBrowserInfo: PhotoBrowserInfo): boolean {// 设置显示大图标志为 falsethis.isBrowserShow = false;return true;}// 接收到该回调后,便可通过 pickerController 相关接口向 picker 发送数据,在此之前不生效// 当图片选择器控制器准备好时触发的回调函数private onPickerControllerReady(): void {// 这里可以添加向选择器发送数据的逻辑}// 大图左右滑动的回调// 当在图片浏览器(大图模式)中左右滑动图片时触发的回调函数private onPhotoBrowserChanged(browserItemInfo: BaseItemInfo): boolean {// 更新当前选中图片的 URIthis.currentUri = browserItemInfo.uri ?? '';return true;}// 已勾选图片被删除时的回调// 当已勾选的图片被删除时触发的回调函数private onSelectedItemsDeleted(baseItemInfos: Array<BaseItemInfo>): void
相关文章:
【HarmonyOS 5】鸿蒙用户头像编辑功能实践
【HarmonyOS 5】鸿蒙用户头像编辑功能实践 一、前言 1、应用背景 在鸿蒙化开发过程中,我们发现最基本常见的功能–用户头像的编辑,实现方式和Android与IOS有极大的不同。 在实际开发和调研的过程中,我们发现并总结了鸿蒙隐私处理与业内Android和IOS的差异性。发现隐私保…...
VTK|结合qt创建通用按钮控制显隐(边框、坐标轴、点线面)
文章目录 增加边框BoundingBox添加addBoundingBox添加BoundingBox控制按钮点击按钮之后的槽函数 添加坐标轴增加点线面显隐控制按钮添加控制点线面显隐的按钮到三维显示界面控制面显示槽函数控制线显示槽函数控制点显示槽函数 增加边框BoundingBox 增加边框BoundingBox并通过按…...
Python Cookbook-7.3 在 Pickling 的时候压缩
任务 你想以一种压缩的方式来 pickle 一般的 Python 对象。 解决方案 标准库模块 cPickle 和 gzip提供了所需的功能;你只需以适当的方式将它们粘合起来即可: import cPickle,gzip def save(filename,*objects):将对象存为压缩过的磁盘文件fil gzip.open(filename,wb)for o…...
合并两个有序链表 - 简单
************* C topic: 21. 合并两个有序链表 - 力扣(LeetCode) ************* Give the topic an inspection. Hi, guys, how is your holiday break? I went to 黄山 in the past few days. The mount Huang is really beautiful. 天都峰 is real…...
手写 Vue 源码 === Effect 机制解析
目录 核心概念 响应式效果的实现 依赖收集的具体流程 为什么使用全局变量? 嵌套 effect 的处理 总结 Vue3 的响应式系统核心在于跟踪依赖并在数据变化时触发更新。effect.ts文件实现了这一机制的核心部分,下面我们来梳理其中的关键思路。 核心概念…...
《AI大模型应知应会100篇》第49篇:大模型应用的成本控制策略
第49篇:大模型应用的成本控制策略 🧾 摘要 随着AI大模型的广泛应用,其高昂的部署与运行成本成为企业面临的一大挑战。本文将从技术架构、资源优化、业务模式等多个维度出发,系统性地讲解如何在保障服务质量的前提下,实…...
利用Ollama部署DeepSeek模型
利用Ollama部署DeepSeek模型 最近,DeepSeek作为一款高效的推理模型受到了广泛关注,但在使用网页版过程中,总是遇到服务器繁忙,因此尝试在本地部署DeepSeek来使用。 一、Ollama安装指南 Ollama是一个开源的AI大模型部署工具&…...
数字孪生储能充电站,实现智慧能源设施全景管控
图扑将储能充电站的电池组、充电桩、配电系统等设备进行数字孪生,通过实时接入充放电数据、设备状态及能耗信息,以三维可视化界面直观呈现储能动态、电力调度与运维场景,助力运营方优化资源配置、预判设备故障,推动储能充电设施高…...
MCP服务发展现状的有趣发现
MCP服务发展现状的有趣发现 当前,MCP(Model Context Protocol)在AI领域逐渐成为一个热门话题。其核心意义在于赋予大模型直接调用外部工具的能力,从而打破“数据孤岛”,实现真正的工具增强型AI。然而,在深…...
aws平台windows虚拟机扩容
收到aws平台windows虚拟机扩容磁盘的请求 登陆aws平台ec2找的对应的虚拟机 进入实例详情 然后点击存储 点击进入卷 然后远程登陆这台虚拟机 在运行对话框中,输入 diskmgmt.msc 并按 Enter。然后,磁盘管理实例程序随之打开 在 Disk Management 菜单上&am…...
QuecPython+Aws:快速连接亚马逊 IoT 平台
提供一个可接入亚马逊 Iot 平台的客户端,用于管理亚马逊 MQTT 连接和影子设备。 初始化客户端 Aws class Aws(client_id,server,port,keep_alive,ssl,ssl_params)参数: client_id (str) - 客户端唯一标识。server (str) - 亚马逊 Iot 平台服务器地址…...
从创业踩雷到依法解债:湖北理元理律师事务所的危机拆解逻辑
“本以为最坏结果是创业失败,没想到差点毁了家庭。”34岁的武汉宝妈李婷(化名)在咖啡厅里翻着厚厚的案件材料。因参与朋友奶茶店项目,她在网贷平台借款28万,却因合同漏洞陷入债务旋涡。本文将拆解专业机构处理此类案件…...
1、Kafka与消息队列核心原理详解
消息队列(Message Queue, MQ)作为现代分布式系统的基础组件,极大提升了系统的解耦、异步处理和削峰能力。本文以Kafka为例,系统梳理消息队列的核心原理、架构细节及实际应用。 Kafka 基础架构及术语关系图 术语简要说明 Produce…...
【Linux系统】线程安全
线程安全和重入问题 概念 线程安全:多个线程在访问共享资源时,能够正确地执行,不会相互干扰或破坏彼此的执行结果。一般而言,多个线程并发同一段只有局部变量的代码时,不会出现不同的结果。但是对全局变量或者静态变…...
什么是gitlab自动部署,怎么配置gitlab自动部署
在现代软件开发流程中,自动化部署是提高效率和确保软件质量的关键环节。GitLab作为一个强大的DevOps平台,提供了完整的自动部署工具,帮助开发团队实现代码从编写到生产的无缝转换。本文将详细解析GitLab的自动部署功能是什么,如何进行操作,以及这一功能的实用性评估,帮助…...
Android开发-工程结构
在进行Android应用开发时,了解并掌握项目的工程结构是非常重要的一步。一个典型的Android项目由多个模块组成,每个模块又包含不同的目录和文件,它们各自承担着特定的功能。本文将带你深入了解Android Studio生成的默认项目结构,并…...
典籍知识问答模块AI问答功能feedbackBug修改+添加对话名称修改功能
1.feedbackBug修改 由于原先定为enum类型,导致无法正常评价,一直报错Data truncated for column feedback at row 1,将其修改为varchar类型,而类型选择在代码中实现 QAService代码修改后如下: 2.添加对话名称修改功…...
极狐Gitlab 里程碑功能介绍
极狐GitLab 是 GitLab 在中国的发行版,关于中文参考文档和资料有: 极狐GitLab 中文文档极狐GitLab 中文论坛极狐GitLab 官网 里程碑 (BASIC ALL) 极狐GitLab 中的里程碑是一种跟踪议题和合并请求的方法,这些请求是为了在特定时间段内实现更…...
信奥赛CSP-J复赛集训(DP专题)(37):P4170 [CQOI2007] 涂色
信奥赛CSP-J复赛集训(DP专题)(37):P4170 [CQOI2007] 涂色 题目描述 假设你有一条长度为 5 5 5 的木板,初始时没有涂过任何颜色。你希望把它的 5 5 5 个单位长度分别涂上红、绿、蓝、绿、红色,…...
代码随想录算法训练营第五十六天| 图论2—卡码网99. 岛屿数量(dfs bfs)
假期归来继续刷题,图论第二天,主要是进一步熟悉dfs 和 bfs 的运用。 99. 岛屿数量(dfs) 99. 岛屿数量 ACM模式还是需要练,不过现在输入输出的感觉已经比较熟悉了。首先是要按照输入搭建一个grid,然后有一…...
iOS开发架构——MVC、MVP和MVVM对比
文章目录 前言MVC(Model - View - Controller)MVP(Model - View - Presenter)MVVM(Model - View - ViewModel) 前言 在 iOS 开发中,MVC、MVVM、和 MVP 是常见的三种架构模式,它们主…...
雅思阅读--易错词汇60个
文章目录 5. pretty6. matterIt does not matter ...7. stage8. draw... draw attention ...5. pretty 23个大满贯单打冠军,传奇网球运动员 WIlliams 曾经说过: I’ve always been pretty confident in my abilities. 翻译:我一直对自己的能力很有信心。 分析:在本句中,“…...
精益数据分析(44/126):深度解析媒体网站商业模式的关键要点
精益数据分析(44/126):深度解析媒体网站商业模式的关键要点 在创业与数据分析的探索道路上,我们不断挖掘不同商业模式的核心要素,今天将深入剖析媒体网站商业模式。希望通过对《精益数据分析》相关内容的解读…...
【回眸】QAC使用指南——导出 Dashboard Report个性化定制Report
前言 按错误级别导出Dashboard的报告 导出Dashboard个性化定制报告 添加个性化设计 导出个性化报告(HTML/PDF/XML) 过滤级别错误 后记 前言 QAC除了导出常规的报告之外,还可以导出Dashboard的报告(XML格式或者PDF格式&…...
高铁座位指示灯系统技术深度解析:从物联网到智慧出行的实践路径
摘要 高铁座位指示灯系统作为铁路数字化转型的核心场景,通过物联网、实时数据同步等技术,实现了客票系统与列车座位状态的动态联动。本文结合权威技术文档与现场实践,从系统架构、数据交互、工程实现等维度展开深度解析,并探讨其…...
ReSearch:强化学习赋能大模型,推理与搜索的创新融合
ReSearch:强化学习赋能大模型,推理与搜索的创新融合 大语言模型(LLMs)的推理能力不断提升,却在与外部搜索结合处理复杂问题时遇阻。本文提出的ReSearch框架,借助强化学习让LLMs学会将搜索融入推理…...
python的selenium操控浏览器
咱们以操控谷歌浏览器为例子 各系统谷歌浏览器及其工具最新版本下载地址 Chrome for Testing availability 查看谷歌浏览器版本 设置->关于Chrome->查看当前谷歌浏览器版本 下载与谷歌浏览器版本对应的chromedriver 注意:与谷歌浏览器版本一模一样的不一定…...
1、PLC控制面板 - /自动化与控制组件/plc-control-panel
76个工业组件库示例汇总 PLC控制系统监控面板 这是一个用于PLC控制系统监控面板的自定义组件,提供了PLC编程与自动化控制逻辑设计的可视化监控界面。组件采用工业风格设计,包含实时数据展示、系统状态监控、控制功能以及报警和日志记录等功能。 功能特…...
LeetCode 热题 100 279. 完全平方数
LeetCode 热题 100 | 279. 完全平方数 大家好,今天我们来解决一道经典的动态规划问题——完全平方数。这道题在 LeetCode 上被标记为中等难度,要求找到和为给定整数 n 的完全平方数的最少数量。 问题描述 给定一个整数 n,返回和为 n 的完全…...
USB学习【2】通讯的基础-反向不归零编码
一.写在前面 所有的通讯协议,发送端和接收端必须按照同一节奏发送信号和接受信号才能保证通讯的正常进行,否则会出现错位。 这个节奏用我自己的话说:时间卡尺。 串口协议是通过约定好波特率来进行解析信号。IIC是专门有一个时钟线作为时间卡…...
Polygon Miden网络:具有客户端执行的边缘区块链
1. 引言 LambdaClass与Miden已合作超过18个月,这段合作关系始于帮助 Miden 开发客户端,为 Miden 网络提供交易执行和证明的支持。随着时间推移,双方的合作不断加深,工作也扩展到了协议和节点的开发上,涵盖了多个方面。…...
临床智能体AI与环境感知AI的融合:基于python的医疗自然语言处理深度分析
引言 医疗领域的数智化进程正以前所未有的速度推进,人工智能技术的应用尤为显著。随着大型语言模型(LLMs)的迅猛发展,医疗AI已从简单的辅助工具升级为复杂的智能体系统。临床智能体AI与环境感知AI的融合代表了医疗AI的最新发展方向,为重塑医疗运营自然语言处理提供了全新…...
Spring AI Alibaba-03- Spring AI + DeepSeek-R1 + ES/Milvus + RAG 智能对话应用开发全流程
Spring AI Alibaba-03- Spring AI DeepSeek-R1 ES/Milvus RAG 智能对话应用开发全流程 在[人工智能](AI)应用中,模型通常需要访问外部资源或执行特定操作,例如数据库查询、调用外部API或执行计算任务。Spring AI,作…...
20250506异形拼图块(圆形、三角、正方,椭圆/半圆)的中2班幼儿偏好性测试(HTML)
背景介绍 最近在写一份工具运用报告,关于剪纸难度的。所以设计了蝴蝶描边系列和异形凹凸角拼图。 【教学类-102-20】蝴蝶三色图作品2——卡纸蝴蝶“满格变形图”(滴颜料按压对称花纹、原图切边后变形放大到A4横版最大化)-CSDN博客文章浏览阅读609次,点赞8次,收藏3次。【…...
Edge浏览器PDF字体显示错误
Edge浏览器PDF字体显示错误 软件版本信息 Edge Version: 136.0.3240.50 Word Version: Microsoft Office 专业增强版2021问题描述 在Word中使用多级列表自动编号, 并使用Word软件自带的导出为PDF文件功能, 在Word中显示正常的数字, 在Edge中查看PDF将会出现渲染错误的现象,…...
git中android studio不想提交文件
修改.gitignore文件 *.iml .gradle /local.properties /.idea/caches /.idea/libraries /.idea/modules.xml /.idea/workspace.xml /.idea/navEditor.xml /.idea/assetWizardSettings.xml /.idea/* /app/* .DS_Store /build /captures .externalNativeBuild .cxx local.propert…...
==和equals的区别 hashCode和equals的联系
和equals的区别: 对于没有重写equals()方法的类,和equals的作用是相同的:比较两个实例对象的地址是否相同。而对于重写了equals方法的类,equals方法则比较的是两个实例对象的内容(例如String对象)。 hashC…...
国联股份卫多多与国术科技签署战略合作协议
4月30日,国术科技(北京)有限公司(以下简称“国术科技”)营销中心总经理 王志广、贾雷一行到访国联股份卫多多,同卫多多/纸多多副总裁、产发部总经理段任飞,卫多多机器人产业链总经理桂林展开深入…...
依图科技C++后端开发面试题及参考答案
请介绍你所了解的分布式系统 分布式系统是由多个独立的计算节点通过网络连接组成的系统,这些节点共同协作以完成特定的任务。分布式系统的设计目标在于提升系统的性能、可扩展性、可靠性和容错性。 从性能方面来看,分布式系统能够把任务分配到多个节点…...
【计算机网络】TCP/IP四层模型是什么?与OSI七层模型哪些区别?
TCP/IP四层模型从上到下依次为: 1.应用层 2.传输层 3.网络层 4.网络接口层 一、TCP/IP四层模型: 1.应用层: 提供用户可直接使用的网络服务。如网页、邮件。 关键协议: HTTP/HTTPS:网页浏览。DNS:域名解…...
基于计算机视觉的试卷答题区表格识别与提取技术
基于计算机视觉的试卷答题区表格识别与提取技术 摘要 本文介绍了一种基于计算机视觉技术的试卷答题区表格识别与提取算法。该算法能够自动从试卷图像中定位答题区表格,执行图像方向矫正,精确识别表格网格线,并提取每个答案单元格。本技术可…...
Java面试全栈解析:Spring Boot、Kafka与Redis实战揭秘
《Java面试全栈解析:Spring Boot、Kafka与Redis实战揭秘》 【面试现场】 面试官:(推了推眼镜)小张,你简历里提到用Spring Boot开发过微服务系统,能说说自动配置的实现原理吗? 程序员࿱…...
打成jar 包以后,运行时找不到文件路径?
报错信息: FileNotFoundException。。。。。。。 原因: 打成jar包后,路径src/*可能都找不到了。 使用命令,查看jar包内的结构及文件路径: tar -tf XX.jar 你会看到目录结构: META-INF/ META-INF/MANIFEST.MF main/ ma…...
C++复习2
set、map、multiset、multimap CSTL包含了序列式容器和关联式容器: 序列式容器里面存储的是元素本身,其底层为线性序列的数据结构。比如:vector,list,deque,forward_list(C11)等。 关联式容器里面存储的是…...
el-row el-col
参考layout布局 Element - The worlds most popular Vue UI frameworkElement,一套为开发者、设计师和产品经理准备的基于 Vue 2.0 的桌面端组件库https://element.eleme.cn/#/zh-CN/component/layout#row-attributes 一行可以看做24个 Element UI 中的 el-row 是…...
【旅游网站设计与实现】基于SpringBoot + Vue 的前后端分离项目 | 万字详细文档 + 源码 + 数据库 + PPT
一、项目简介 旅游网站管理系统以信息化为核心,结合用户体验和系统管理功能,为旅游爱好者和管理者提供全面的服务平台。通过系统,用户可以浏览线路、收藏心仪旅游产品、下单订购,管理员则可在后台完成旅游线路管理、用户管理、订…...
On the Biology of a Large Language Model——论文学习笔记——拒答和越狱
本文仍然是对Anthropic团队的模型解释工作 On the Biology of a Large Language Model 的学习笔记。 前几篇课见我的主页中相同标题的几篇文章 本篇主要关注的是该博客中的Refusal和 Life of a Jailbreak这两部分的内容。 一句话总结 在这两部分中,作者展示了以下…...
使用OpenCV 和Dlib 实现表情识别
文章目录 引言1.代码主要概述2.代码解析2.1 面部特征计算函数(1) 嘴部宽高比(MAR)(2) 嘴宽与脸颊宽比值(MJR)(3) 眼睛纵横比(EAR)(4) 眉毛弯曲比(EBR) 2.2 自定义函数显示中文2.3 表情分类逻辑2.4 实时视频处理 3.系统特点4.总结 引言 面部表情是人类情感交流的重要方式&#…...
Matplotlib 饼图
pie():绘制饼图 Matplotlib 直方图 我们也可以结合 Pandas 来绘制直方图 除了数据框之外,我们还可以使用 Pandas 中的 Series 对象绘制直方图。只需将数据框中的列替换为 Series 对象 Matplotlib imshow() imshow() 可以显示灰度图像 imshow() 可以显示彩…...
区块链交易所开发:开启数字交易新时代
区块链交易所开发:开启数字交易新时代 ——2025年技术革新与万亿级市场的破局指南 一、区块链交易所的颠覆性价值 1️⃣ 去中心化革命终结数据霸权 区块链交易所通过分布式账本技术,将交易数据存储于全网节点,彻底消除中心化服务器宕机、跑路…...