主体代码分析

news2026/4/2 1:18:51
一、整体架构分析这个程序是一个图片管理工具采用MVC模式的变体分为UI层界面定义ui_image_manager.py由Qt Designer生成逻辑层当前文件的业务逻辑业务层business_layer.py中的图片处理服务二、导入模块解析pythonimport sys # 系统相关用于退出程序 import os # 操作系统接口用于文件路径操作 from PyQt5.QtWidgets import * # Qt控件类 from PyQt5.QtCore import * # Qt核心功能信号、线程等 from PyQt5.QtGui import * # Qt图形功能字体、图标等 from business_layer import ImageProcessor, ImageInfoService # 自定义业务类 from ui_image_manager import Ui_ImageManagerUI # UI设计文件三、ImageInfoDialog类详解类定义与构造函数pythonclass ImageInfoDialog(QDialog): 图片信息对话框 def __init__(self, file_path, parentNone): super().__init__(parent) # 调用父类构造函数 self.file_path file_path # 保存图片路径 self.info_service ImageInfoService() # 创建信息服务对象 self.initUI() # 初始化界面 self.load_info() # 加载并显示信息调用链main()→ 创建ImageManager对象用户点击信息按钮 →show_image_info()show_image_info()→ImageInfoDialog(file_path, self)对话框显示后自动调用initUI()和load_info()initUI() - 界面初始化pythondef initUI(self): 初始化UI self.setWindowTitle(图片信息) self.setMinimumSize(400, 500) layout QVBoxLayout() # 主布局为垂直布局 # 创建标签页控件 tabs QTabWidget() # 基本信息标签页 basic_tab QWidget() basic_layout QFormLayout() # 表单布局标签-值对 self.basic_labels {} # 存储标签控件 fields [文件名, 路径, 大小, 修改时间, 创建时间, 格式, 尺寸, 色彩模式] for field in fields: label QLabel(-) label.setWordWrap(True) # 允许自动换行 self.basic_labels[field] label basic_layout.addRow(f{field}:, label) # 添加一行字段名值控件 basic_tab.setLayout(basic_layout) tabs.addTab(basic_tab, 基本信息) # EXIF信息标签页 exif_tab QWidget() exif_layout QVBoxLayout() self.exif_text QTextEdit() self.exif_text.setReadOnly(True) # 只读模式 self.exif_text.setFont(QFont(Courier, 9)) # 等宽字体显示数据 exif_layout.addWidget(self.exif_text) exif_tab.setLayout(exif_layout) tabs.addTab(exif_tab, EXIF 信息) layout.addWidget(tabs) # 按钮区域 btn_box QDialogButtonBox(QDialogButtonBox.Ok) btn_box.accepted.connect(self.accept) # 点击OK关闭对话框 layout.addWidget(btn_box) self.setLayout(layout)布局结构textQVBoxLayout垂直布局 ├── QTabWidget标签页 │ ├── 基本信息标签页QFormLayout │ └── EXIF信息标签页QVBoxLayout QTextEdit └── QDialogButtonBox确定按钮load_info() - 加载图片信息pythondef load_info(self): 加载图片信息 try: # 1. 获取文件基本信息 file_info self.info_service.get_file_info(self.file_path) self.basic_labels[文件名].setText(file_info[filename]) self.basic_labels[路径].setText(file_info[path]) self.basic_labels[大小].setText(file_info[size_formatted]) self.basic_labels[修改时间].setText(file_info[modified_time]) self.basic_labels[创建时间].setText(file_info[created_time]) # 2. 获取图片信息 img_info self.info_service.get_image_info(self.file_path) self.basic_labels[格式].setText(img_info[format]) self.basic_labels[尺寸].setText(img_info[dimension]) self.basic_labels[色彩模式].setText(img_info[mode]) # 3. 获取EXIF信息 exif_info self.info_service.get_exif_info(self.file_path) if exif_info: exif_text for tag, value in exif_info.items(): exif_text f{tag}: {value}\n self.exif_text.setText(exif_text) else: self.exif_text.setText(无EXIF信息) except Exception as e: QMessageBox.warning(self, 错误, f无法读取图片信息: {str(e)})调用关系get_file_info(): 返回文件大小、时间等基本信息get_image_info(): 返回图片格式、尺寸、色彩模式get_exif_info(): 返回相机参数等元数据四、ImageManager主窗口类__init__构造函数pythondef __init__(self): super().__init__() self.setupUi(self) # 加载UI设计文件 # 初始化数据成员 self.current_dir QDir.homePath() # 当前目录默认为用户目录 self.selected_files [] # 选中的文件列表 self.processor ImageProcessor() # 图片处理器工作线程 # 初始化各组件 self.init_toolbar() # 创建工具栏 self.init_models() # 初始化文件模型 self.connect_signals() # 连接信号槽 self.init_data() # 初始化数据init_toolbar() - 动态创建工具栏pythondef init_toolbar(self): 在逻辑中创建工具栏组件 # 方式1如果UI中已有toolBar if hasattr(self, toolBar): # 清空现有Action for action in self.toolBar.actions(): self.toolBar.removeAction(action) # 创建刷新按钮QAction self.refresh_btn QAction( 刷新, self) self.refresh_btn.setObjectName(refresh_btn) self.toolBar.addAction(self.refresh_btn) self.toolBar.addSeparator() # 分隔线 # 添加视图选择下拉框QComboBox view_label QLabel(视图: ) self.toolBar.addWidget(view_label) self.view_mode QComboBox() self.view_mode.addItems([图标视图, 列表视图]) self.toolBar.addWidget(self.view_mode) self.toolBar.addSeparator() # 添加筛选输入框QLineEdit filter_label QLabel( ) self.toolBar.addWidget(filter_label) self.filter_edit QLineEdit() self.filter_edit.setPlaceholderText(筛选图片...) self.filter_edit.setFixedWidth(200) self.toolBar.addWidget(self.filter_edit) # 方式2如果没有toolBar创建一个新的 else: self.toolBar self.addToolBar(工具栏) # ... 创建相同的组件QAction vs QWidgetQAction动作对象可添加到菜单栏、工具栏QWidget普通控件直接添加到工具栏init_models() - 文件系统模型pythondef init_models(self): 初始化文件系统模型 # 目录树模型 self.dir_model QFileSystemModel() self.dir_model.setFilter(QDir.AllDirs | QDir.NoDotAndDotDot) # QDir.AllDirs: 显示所有目录 # QDir.NoDotAndDotDot: 不显示 . 和 .. 目录 self.dir_tree.setModel(self.dir_model) # 设置模型到视图 self.dir_tree.setHeaderHidden(True) # 隐藏表头 # 文件列表模型 self.file_model QFileSystemModel() self.file_model.setFilter(QDir.Files | QDir.NoDotAndDotDot) # 设置图片文件筛选器 self.file_model.setNameFilters([ *.jpg, *.jpeg, *.png, *.gif, *.bmp, *.tiff, *.webp ]) self.file_model.setNameFilterDisables(False) # 不显示不符合筛选的文件 self.file_list.setModel(self.file_model)模型-视图架构QFileSystemModel数据模型管理文件系统数据QTreeView/QListView视图显示数据模型和视图分离数据变化时自动更新视图connect_signals() - 信号槽连接pythondef connect_signals(self): 连接所有信号 # 1. 目录树点击信号 self.dir_tree.clicked.connect(self.on_directory_clicked) # 2. 快速访问按钮使用lambda传递参数 self.home_btn.clicked.connect(lambda: self.change_directory(QDir.homePath())) self.pictures_btn.clicked.connect(lambda: self.change_directory( os.path.join(QDir.homePath(), Pictures) )) self.desktop_btn.clicked.connect(lambda: self.change_directory( os.path.join(QDir.homePath(), Desktop) )) # 3. 菜单栏动作如果存在 if hasattr(self, open_dir_action): self.open_dir_action.triggered.connect(self.open_directory) if hasattr(self, exit_action): self.exit_action.triggered.connect(self.close) if hasattr(self, select_all_action): self.select_all_action.triggered.connect(self.select_all) if hasattr(self, clear_selection_action): self.clear_selection_action.triggered.connect(self.clear_selection) if hasattr(self, about_action): self.about_action.triggered.connect(self.show_about) # 4. 工具栏组件信号 self.refresh_btn.triggered.connect(self.refresh_files) self.view_mode.currentTextChanged.connect(self.change_view_mode) self.filter_edit.textChanged.connect(self.filter_files) # 5. 文件列表信号 self.file_list.doubleClicked.connect(self.preview_image) self.file_list.selectionModel().selectionChanged.connect(self.on_selection_changed) # 6. 操作按钮 self.info_btn.clicked.connect(self.show_image_info) self.convert_btn.clicked.connect(lambda: self.batch_operation(convert)) self.resize_btn.clicked.connect(lambda: self.batch_operation(resize)) self.rename_btn.clicked.connect(lambda: self.batch_operation(rename)) self.compress_btn.clicked.connect(lambda: self.batch_operation(compress)) # 7. 处理器信号跨线程通信 self.processor.progress_updated.connect(self.on_progress_updated) self.processor.status_updated.connect(self.on_status_updated) self.processor.finished.connect(self.on_processing_finished)lambda表达式的作用python# 不使用lambda的情况无法传递参数 self.button.clicked.connect(self.function) # function()不能有参数 # 使用lambda传递参数 self.button.clicked.connect(lambda: self.function(param))五、核心功能函数目录导航相关pythondef on_directory_clicked(self, index): 目录树点击回调 # 从模型中获取路径 path self.dir_model.filePath(index) self.change_directory(path) def change_directory(self, path): 改变当前目录 if os.path.exists(path) and os.path.isdir(path): self.current_dir path # 更新文件列表模型 self.file_model.setRootPath(path) # 设置视图的根索引只显示指定目录下的文件 self.file_list.setRootIndex(self.file_model.index(path)) # 更新目录树的高亮可选 self.dir_tree.setRootIndex(self.dir_model.index(path)) # 清空状态 self.selected_files [] self.update_selection_info() # 清空预览 self.preview_label.setText( 选择图片预览) self.preview_label.setPixmap(QPixmap()) # 更新状态栏 self.statusBar().showMessage(f当前目录: {path}) # 统计并显示图片数量 self.update_image_count()关键点setRootPath(): 设置模型的根路径index(): 获取路径对应的模型索引setRootIndex(): 设置视图显示的起始位置文件统计pythondef update_image_count(self): 更新图片数量显示 try: count 0 # 遍历当前目录 for file in os.listdir(self.current_dir): file_path os.path.join(self.current_dir, file) if os.path.isfile(file_path): ext os.path.splitext(file)[1].lower() # 获取扩展名并转小写 if ext in [.jpg, .jpeg, .png, .gif, .bmp, .tiff, .webp]: count 1 # 状态栏显示3000毫秒后自动消失 self.statusBar().showMessage(f当前目录: {self.current_dir} | 图片文件: {count} 个, 3000) except: pass视图模式切换pythondef change_view_mode(self, mode): 改变视图模式 if mode 图标视图: self.file_list.setViewMode(QListView.IconMode) self.file_list.setIconSize(QSize(100, 100)) # 图标大小 self.file_list.setGridSize(QSize(120, 120)) # 网格大小 else: # 列表视图 self.file_list.setViewMode(QListView.ListMode) self.file_list.setIconSize(QSize(48, 48))文件筛选pythondef filter_files(self, text): 筛选文件 if text.strip(): # 创建包含筛选文本的通配符 # 例如输入cat - *cat*.jpg filters [ f*{text}*.jpg, f*{text}*.jpeg, f*{text}*.png, f*{text}*.gif, f*{text}*.bmp, f*{text}*.tiff, f*{text}*.webp ] self.file_model.setNameFilters(filters) else: # 重置为所有图片文件 self.file_model.setNameFilters([ *.jpg, *.jpeg, *.png, *.gif, *.bmp, *.tiff, *.webp ]) # 刷新模型 self.file_model.setRootPath(self.current_dir) self.file_list.setRootIndex(self.file_model.index(self.current_dir))选择管理pythondef update_selection_info(self): 更新选择信息 # 获取所有选中的索引 indexes self.file_list.selectionModel().selectedIndexes() self.selected_files [] # 遍历选中的索引 for index in indexes: if index.column() 0: # 只处理第一列避免重复 file_path self.file_model.filePath(index) if os.path.isfile(file_path): self.selected_files.append(file_path) count len(self.selected_files) self.selected_info.setText(f{count} 个文件选中) # 计算总大小 if count 0: total_size sum(os.path.getsize(f) for f in self.selected_files if os.path.exists(f)) self.total_size_label.setText(f总大小: {self.format_size(total_size)}) else: self.total_size_label.setText(总大小: 0 B) # 单个文件自动预览 if count 1: self.show_preview(self.selected_files[0]) else: self.preview_label.setText( 选择图片预览) self.preview_label.setPixmap(QPixmap())注意selectedIndexes()可能返回多列需要过滤只取第一列。图片预览pythondef show_preview(self, file_path): 显示图片预览 try: if not os.path.exists(file_path): self.preview_label.setText(文件不存在) return # 加载图片 pixmap QPixmap(file_path) if not pixmap.isNull(): # 获取预览区域大小减去边距 label_width self.preview_label.width() - 20 label_height self.preview_label.height() - 20 if label_width 0 and label_height 0: # 缩放图片 scaled_pixmap pixmap.scaled( label_width, label_height, Qt.KeepAspectRatio, # 保持宽高比 Qt.SmoothTransformation # 平滑变换抗锯齿 ) self.preview_label.setPixmap(scaled_pixmap) self.preview_label.setText() # 清除文本 else: self.preview_label.setText(预览区域大小异常) else: self.preview_label.setText(无法预览该文件\n\n文件可能已损坏或格式不支持) except Exception as e: self.preview_label.setText(f预览失败:\n{str(e)})缩放算法Qt.KeepAspectRatio保持原始宽高比图片会完整显示Qt.SmoothTransformation使用高质量缩放算法批量操作pythondef batch_operation(self, operation): 批量操作 # 检查是否有选中的文件 if not self.selected_files: QMessageBox.warning(self, 提示, 请先选择图片文件) return # 确认对话框 msg f确定要对 {len(self.selected_files)} 个文件执行操作吗 reply QMessageBox.question(self, 确认, msg, QMessageBox.Yes | QMessageBox.No) if reply ! QMessageBox.Yes: return # 收集操作参数 params {} if operation resize: params { width: self.width_spin.value(), height: self.height_spin.value() } elif operation convert: params {format: self.format_combo.currentText()} elif operation rename: params {pattern: self.rename_pattern.text()} elif operation compress: params {quality: self.quality_spin.value()} # 显示进度条并禁用按钮 self.progress_bar.setVisible(True) self.progress_bar.setValue(0) self.set_operations_enabled(False) # 启动处理线程 self.processor.set_task(self.selected_files, operation, params) self.processor.start()线程处理流程主线程准备参数禁用UI显示进度条工作线程执行耗时操作ImageProcessor.run()工作线程通过信号更新进度完成后发送finished信号主线程重新启用UI刷新文件列表进度更新回调pythondef on_progress_updated(self, value): 进度更新槽函数 self.progress_bar.setValue(value) def on_status_updated(self, status): 状态更新 self.status_label.setText(status) def on_processing_finished(self): 处理完成 self.progress_bar.setValue(0) self.progress_bar.setVisible(False) self.status_label.setText(处理完成) self.set_operations_enabled(True) # 刷新文件列表 self.refresh_files() QMessageBox.information(self, 完成, 批量操作已完成)六、工具函数文件大小格式化pythondef format_size(self, size): 格式化文件大小 for unit in [B, KB, MB, GB]: if size 1024: return f{size:.1f} {unit} size / 1024 return f{size:.1f} TB算法说明循环判断大小是否小于1024是返回当前单位否除以1024继续下一个单位关于对话框pythondef show_about(self): 显示关于对话框 QMessageBox.about( self, 关于智能图片管理器, h2智能图片管理器 v1.0/h2 p一个功能强大的图片管理工具/p p功能特点/p ul li图片浏览和预览/li li格式转换 (PNG, JPEG, BMP)/li li批量调整大小/li li批量重命名/li li图片压缩/li liEXIF信息查看/li /ul p使用 PyQt5 和 Pillow 构建/p )HTML支持QMessageBox支持简单的HTML标签可以美化显示。七、事件处理窗口大小改变事件pythondef resizeEvent(self, event): 窗口大小改变时重新调整预览图片 super().resizeEvent(event) # 调用父类方法保持默认行为 # 如果有选中的单个文件重新预览 if len(self.selected_files) 1: self.show_preview(self.selected_files[0])作用当用户调整窗口大小时预览图片会自适应新的大小。窗口关闭事件pythondef closeEvent(self, event): 关闭窗口时停止线程 # 检查处理器线程是否在运行 if self.processor.isRunning(): self.processor.stop() # 发送停止信号 self.processor.wait() # 等待线程结束最多默认30秒 event.accept() # 接受关闭事件重要性防止后台线程继续运行导致程序无法完全退出。八、主程序入口pythondef main(): # 1. 创建应用程序对象必须每个Qt应用只有一个 app QApplication(sys.argv) # 2. 设置应用样式 app.setStyle(Fusion) # Fusion是跨平台样式 # 3. 设置全局字体 font QFont() font.setPointSize(9) app.setFont(font) # 4. 创建并显示主窗口 window ImageManager() window.show() # 5. 进入事件循环 sys.exit(app.exec_()) # 脚本入口 if __name__ __main__: main()执行流程main()被调用创建QApplication实例创建主窗口ImageManagerwindow.show()显示窗口app.exec_()启动事件循环程序开始运行用户操作触发各种信号和事件关闭窗口时退出事件循环程序结束九、完整调用关系图text程序启动 ↓ main() ↓ 创建 QApplication ↓ 创建 ImageManager ├── __init__() │ ├── setupUi() - 加载UI │ ├── init_toolbar() - 创建工具栏 │ ├── init_models() - 初始化文件模型 │ ├── connect_signals() - 连接信号槽 │ └── init_data() - 初始化数据 ↓ window.show() ↓ app.exec_() - 事件循环 ↓ 用户操作 ├── 点击目录树 │ └── on_directory_clicked() → change_directory() ├── 选择文件 │ └── on_selection_changed() → update_selection_info() → show_preview() ├── 双击文件 │ └── preview_image() → show_preview() ├── 查看信息 │ └── show_image_info() → ImageInfoDialog() │ ├── initUI() │ └── load_info() │ ├── info_service.get_file_info() │ ├── info_service.get_image_info() │ └── info_service.get_exif_info() └── 批量操作 └── batch_operation() ├── 确认对话框 ├── 禁用UI ├── processor.set_task() ├── processor.start() └── 信号处理 ├── on_progress_updated() ├── on_status_updated() └── on_processing_finished() ├── 启用UI └── refresh_files()十、学习要点总结1. PyQt5核心概念信号与槽对象间通信机制模型/视图数据与显示分离事件系统重写事件处理函数多线程QThread与信号跨线程通信2. 设计模式观察者模式信号槽MVC模式Model-View-Controller策略模式不同操作类型单例模式QApplication3. 编程技巧Lambda表达式传递参数给槽函数字典映射批量操作参数异常处理确保程序稳定资源管理线程正确停止4. 文件操作os模块路径操作、文件遍历QFileSystemModel文件系统模型QPixmap图片加载和缩放

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

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

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…