当前位置: 首页 > news >正文

pyqt中以鼠标所在位置为锚点缩放图片

在编写涉及到图片缩放的pyqt程序时,如果以鼠标为锚点缩放图片,图片上处于鼠标所在位置的点(通常也是用户关注的图片上的点)不会移动,更不会消失在图片显示区域之外,可以提高用户体验,是一个值得实现的效果。

实现以鼠标所在位置为锚点进行图片缩放的效果的最简单的方法是以QGraphicsView作为图片的容器,只需要在初始化时设置:

self.setTransformationAnchor(QGraphicsView.AnchorUnderMouse)

即可实现以鼠标为锚点缩放图片的效果。下面是一个简单示例:

from PyQt5.QtWidgets import (QApplication, QMainWindow, QGraphicsView, QGraphicsScene, QPushButton, QVBoxLayout, QFileDialog, QWidget
)
from PyQt5.QtGui import QPixmap
from PyQt5.QtCore import Qt
import sysclass ImageViewer(QGraphicsView):def __init__(self, parent=None):super().__init__(parent)self.scene = QGraphicsScene(self)self.setScene(self.scene)self.scale_factor = 1.0  # 缩放因子self.setDragMode(QGraphicsView.ScrollHandDrag)  # 设置拖动模式self.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)self.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff)self.setTransformationAnchor(QGraphicsView.AnchorUnderMouse)  # 设置缩放锚点为鼠标位置def add_image(self, image_path):"""向 QGraphicsView 中添加一张图片"""pixmap = QPixmap(image_path)if pixmap.isNull():return# 创建 QGraphicsPixmapItem 并添加到场景中pixmap_item = self.scene.addPixmap(pixmap)pixmap_item.setTransformationMode(Qt.SmoothTransformation)# 其他图片:可移动、可缩放pixmap_item.setFlags(pixmap_item.flags() | pixmap_item.ItemIsMovable)  # 添加可移动标志def wheelEvent(self, event):"""实现以鼠标位置为锚点的缩放"""# 获取鼠标在视图中的位置# mouse_pos = event.pos()# 将鼠标位置转换为场景坐标# scene_pos = self.mapToScene(mouse_pos)# 根据滚轮方向调整缩放因子if event.angleDelta().y() > 0:scale_change = 1.15  # 放大else:scale_change = 1 / 1.15  # 缩小# 执行缩放,水平方向与垂直方向等比例缩放self.scale(scale_change, scale_change)class MainWindow(QMainWindow):def __init__(self):super().__init__()self.setWindowTitle("Image Viewer with Multiple Images")self.setGeometry(100, 100, 800, 600)# 创建主窗口布局central_widget = QWidget()self.setCentralWidget(central_widget)layout = QVBoxLayout(central_widget)# 创建 QGraphicsViewself.graphics_view = ImageViewer(self)layout.addWidget(self.graphics_view)# 创建按钮self.load_button = QPushButton("加载图片")self.load_button.clicked.connect(self.open_file_dialog)layout.addWidget(self.load_button)def open_file_dialog(self):"""打开文件对话框选择图片"""file_path, _ = QFileDialog.getOpenFileName(self, "选择图片", "", "图片文件 (*.png *.jpg *.jpeg *.bmp)")if file_path:self.graphics_view.add_image(file_path)if __name__ == "__main__":app = QApplication(sys.argv)window = MainWindow()# 禁用最大化按钮window.setWindowFlags(window.windowFlags() & ~Qt.WindowMaximizeButtonHint)window.show()sys.exit(app.exec_())

上面的示例包含三个步骤:

1、创建了一个类ImageViewer继承QGraphicsView,在__init__方法中设置以鼠标所在位置为锚点缩放:

# 设置缩放锚点为鼠标位置

self.setTransformationAnchor(QGraphicsView.AnchorUnderMouse)  

2、通过QGraphicsPixmapItem加载一张图片,然后将QGraphicsPixmapItem加入场景:

# 创建并设置场景

self.scene = QGraphicsScene(self)

self.setScene(self.scene)

pixmap = QPixmap(image_path)

if pixmap.isNull():

      return

# 创建 QGraphicsPixmapItem 加载图片,并将QGraphicsPixmapItem添加到场景中

pixmap_item = self.scene.addPixmap(pixmap)

3、重写wheelEvent事件实现图片缩放:

def wheelEvent(self, event):

        """实现以鼠标位置为锚点的缩放"""

        # 根据滚轮方向调整缩放因子

        if event.angleDelta().y() > 0:

            scale_change = 1.15  # 放大

        else:

            scale_change = 1 / 1.15  # 缩小

        # 执行缩放,水平方向与垂直方向等比例缩放

        self.scale(scale_change, scale_change)

可以看到,通过以上三个步骤,基本上不用添加与图片位置相关的代码,QGraphicsView就实现了以鼠标所在位置为锚点缩放图片的效果。

但是,QGraphicsView有许多自身的特性,如果在一些特殊场景中需要避免使用QGraphicsView的某些特性,或者仅仅出于自己的喜好选择不使用QGraphicsView(不过处理大型和大量图片的最佳选择还是使用QGraphicsView),如何实现以鼠标所在位置为锚点缩放图片的效果呢?

先看以下图示:

首先有一个显示图片的容器,例如QLabel,给这个容器一个固定的尺寸,它有一个以左上角为(0,0)的坐标系。

其次有一张图片,为美观起见,将这张图片(实际上是经过缩放后的图片)水平垂直居中显示在容器中,图片自身拥有一个以图片的左上角为(0,0)的像素坐标系。像素坐标系与容器坐标系的原点存在偏差(img_offset),而图片上所有像素在图片像素坐标系中的坐标与在容器坐标系中的坐标的偏差与两个坐标系原点的偏差是相等的。经过缩放后,鼠标在图片上的位置会发生偏移delta_offset,只需将img_offset调整delta_offset,那么,缩放后的鼠标位置就调整回了缩放前的位置,形成了以鼠标为锚点的缩放效果。应当注意的是,容器响应鼠标事件时,鼠标位置的值是以容器坐标系的数据表示的,而前述调整img_offset的方法是基于图片像素坐标系的,因此要将容器坐标系表示的鼠标位置转换为图片像素坐标系,方法如下(以下代码中img_offset采用了scaled_pixmap_offset的变量名):

mouse_pos_on_scaled_pixmap = event.pos() - self.scaled_pixmap_offset

也就是说,需要在wheelEvent事件中添加一些坐标变换的代码,具体如下:

     def wheelEvent(self, event: QWheelEvent):"""重写滚轮事件,实现缩放"""mouse_pos_on_scaled_pixmap = event.pos() - self.scaled_pixmap_offset# 根据滚轮方向调整缩放因子if event.angleDelta().y() > 0:zoom_factor = 1.15  # 放大else:zoom_factor = 1 / 1.15  # 缩小# 计算累计缩放比例self.scale_factor *= zoom_factor# 缩放图片self.scaled_pixmap = self.original_pixmap.scaled(self.size() * self.scale_factor,Qt.KeepAspectRatio,Qt.SmoothTransformation)# 计算鼠标在图片缩放前后的偏移量delta_offset = mouse_pos_on_scaled_pixmap * (zoom_factor - 1)# 调整图像显示位置对容器左上角的偏移量self.scaled_pixmap_offset -= delta_offset# 更新图像显示self.update()

完整示例如下:

from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel, QVBoxLayout, QWidget, QFileDialog, QPushButton
from PyQt5.QtGui import QPixmap, QImage, QWheelEvent, QPainter
from PyQt5.QtCore import Qt, QPointFclass ImageLabel(QLabel):def __init__(self, parent=None):super().__init__(parent)self.setAlignment(Qt.AlignCenter)  # 图像居中显示self.scale_factor = 1.0  # 缩放因子self.original_pixmap = None  # 原始图像self.scaled_pixmap = None  # 缩放后的图像self.setFixedSize(600, 600)self.scaled_pixmap_offset = QPointF(0, 0)def set_image(self, image_path):"""加载图像并显示"""self.original_pixmap = QPixmap(image_path)if self.original_pixmap.isNull():returnif self.scaled_pixmap is None:self.scaled_pixmap = self.original_pixmap.scaled(self.size(),Qt.KeepAspectRatio,Qt.SmoothTransformation)self.scaled_pixmap_offset_x = (self.size().width() - self.scaled_pixmap.size().width()) / 2self.scaled_pixmap_offset_y = (self.size().height() - self.scaled_pixmap.size().height()) / 2self.scaled_pixmap_offset = QPointF(self.scaled_pixmap_offset_x, self.scaled_pixmap_offset_y)self.update()def paintEvent(self, event):painter = QPainter(self)if self.scaled_pixmap is not None:painter.drawPixmap(self.scaled_pixmap_offset, self.scaled_pixmap)def wheelEvent(self, event: QWheelEvent):"""重写滚轮事件,实现缩放"""mouse_pos_on_scaled_pixmap = event.pos() - self.scaled_pixmap_offset# 根据滚轮方向调整缩放因子if event.angleDelta().y() > 0:zoom_factor = 1.15  # 放大else:zoom_factor = 1 / 1.15  # 缩小# 计算累计缩放比例self.scale_factor *= zoom_factor# 缩放图片self.scaled_pixmap = self.original_pixmap.scaled(self.size() * self.scale_factor,Qt.KeepAspectRatio,Qt.SmoothTransformation)# 计算鼠标在图片缩放前后的偏移量delta_offset = mouse_pos_on_scaled_pixmap * (zoom_factor - 1)# 调整图像显示位置对容器左上角的偏移量self.scaled_pixmap_offset -= delta_offset# 更新图像显示self.update()class MainWindow(QMainWindow):def __init__(self):super().__init__()self.setWindowTitle("Image Viewer with QLabel")self.setGeometry(100, 100, 800, 600)# 创建主窗口布局central_widget = QWidget()self.setCentralWidget(central_widget)layout = QVBoxLayout(central_widget)# 创建 QLabel 用于显示图像self.image_label = ImageLabel(self)layout.addWidget(self.image_label)# 创建按钮self.load_button = QPushButton("加载图片")self.load_button.clicked.connect(self.open_file_dialog)layout.addWidget(self.load_button)def open_file_dialog(self):"""打开文件对话框选择图片"""file_path, _ = QFileDialog.getOpenFileName(self, "选择图片", "", "图片文件 (*.png *.jpg *.jpeg *.bmp)")if file_path:self.image_label.set_image(file_path)if __name__ == "__main__":app = QApplication([])window = MainWindow()# 禁用最大化按钮window.setWindowFlags(window.windowFlags() & ~Qt.WindowMaximizeButtonHint)window.show()app.exec_()

相信经过这两个示例,特别是后一个自己编程实现的示例,可以完全掌握以鼠标为锚点缩放图片的原理,并在pyqt以外的其他领域运用自如了。

相关文章:

pyqt中以鼠标所在位置为锚点缩放图片

在编写涉及到图片缩放的pyqt程序时,如果以鼠标为锚点缩放图片,图片上处于鼠标所在位置的点(通常也是用户关注的图片上的点)不会移动,更不会消失在图片显示区域之外,可以提高用户体验,是一个值得…...

登高架设作业证考试的实操项目有哪些?

登高架设作业证考试的实操项目分为 4 个科目,包括安全防护用品使用、作业现场安全隐患排除、安全操作技术、作业现场应急处置,具体内容如下: 科目一:安全防护用品使用(K1) 考试项目:安全帽、安全…...

闻性与空性:从耳根圆通到究竟解脱的禅修路径

一、闻性之不动:超越动静的觉性本质 在《楞严经》中,佛陀以钟声为喻揭示闻性的奥秘:钟声起时,闻性显现;钟声歇时,闻性不灭。此“不动”并非如磐石般凝固,而是指觉性本身超越生灭、来去的绝对性…...

404了怎么办快把路由给我断掉(React配置路由)

路由基础概念 什么是前端路由? 核心作用:管理单页面应用的页面切换主要功能: 根据URL显示对应组件 保持浏览器历史记录 实现页面间导航不刷新 React Router 包含三个主要包: react-router:核心逻辑react-router-d…...

React类组件与React Hooks写法对比

React 类组件 vs Hooks 写法对比 分类类组件(Class Components)函数组件 Hooks组件定义class Component extends React.Componentconst Component () > {}状态管理this.state this.setState()useState()生命周期componentDidMount, componentDidU…...

Tailwind CSS实战:快速构建定制化UI的新思路

引言 在当今快节奏的前端开发环境中,开发者不断寻找能够提高效率并保持灵活性的工具。Tailwind CSS作为一个功能型优先的CSS框架,正在改变开发者构建用户界面的方式。与Bootstrap和Material UI等传统组件库不同,Tailwind不提供预设组件&…...

告别手动映射:在 Spring Boot 3 中优雅集成 MapStruct

在日常的后端开发中,我们经常需要在不同的对象之间进行数据转换,例如将数据库实体(Entity)转换为数据传输对象(DTO)发送给前端,或者将接收到的 DTO 转换为实体进行业务处理或持久化。手动进行这…...

JavaScript学习教程,从入门到精通,Ajax数据交换格式与跨域处理(26)

Ajax数据交换格式与跨域处理 一、Ajax数据交换格式 1. XML (eXtensible Markup Language) XML是一种标记语言,类似于HTML但更加灵活,允许用户自定义标签。 特点: 可扩展性强结构清晰数据与表现分离文件体积相对较大 示例代码&#xff1…...

抖音IP属地跟无线网有关系吗?一文解析

在抖音等社交平台上,IP属地显示功能让许多用户感到好奇——为什么自己的位置信息有时准确,有时却显示在其他城市?这时,用户会疑惑:抖音IP属地跟无线网有关系吗?本文将详细解析‌IP属地‌和‌无线网‌的概念…...

RDK X3新玩法:超沉浸下棋机器人开发日记

一、项目介绍 产品中文名:超沉浸式智能移动下棋机器人 产品英文名:Hackathon-TTT 产品概念:本项目研发的下棋机器人,是一款能自主移动、具备语音交互并能和玩家在真实的棋盘上进行“人机博弈”的移动下棋平台,能够带给…...

Trae 实测:AI 助力前端开发,替代工具还远吗?

Trae 实测:AI 助力前端开发,替代工具还远吗? 字节上线了一款 AI 新产品,名叫 Trae 。这是一款 IDE 工具,中文意思是「集成开发环境」,做技术的读者对此应该很熟悉。简单理解,就是程序员用来写代…...

SpringCloud基于Eureka和Feign实现一个微服务系统

Spring Cloud 是基于 Spring Boot 的 ‌微服务开发全栈解决方案‌,通过集成多种开源组件,提供分布式系统构建所需的服务治理、配置管理、容错机制‌等核心能力,简化微服务架构的复杂性。其核心目标是实现服务间的高效协同与弹性伸缩,支撑企业级云原生应用开发。Spring Clou…...

nacos设置权重进行负载均衡不生效

nacos设置权重进行负载均衡不生效,必须在启动类下加上这个bean Beanpublic IRule nacosRule(){return new NacosRule();}如下图所示...

Flowable7.x学习笔记(十四)查看部署流程Bpmn2.0-xml

前言 Flowable 在其前端 Modeler 中,采用 BPMN 2.0 标准将流程中的任务、网关、事件等元素以 XML 形式存储,并附带图形互换(Diagram Interchange,DI)数据,以保证在前端与后端都能精准重建可视化流程图。 生…...

大模型应用中Agent2Agent(A2A)的应用场景,以及A2A与MCP的区别和适用场景

大家好,我是微学AI,今天给大家介绍一下大模型应用中Agent2Agent(A2A)的应用场景,以及A2A与MCP的区别和适用场景。 文章目录 一、引言二、Agent2Agent(A2A)协议原理2.1 核心架构2.2 基础框架与依…...

Windows server:

企鹅裙:429603659 域搭建 (细节上的问题) 1.将IP地址修改为静态IP,搭建完后设置DNS为本身(在搭建完域服务器后设置DNS) 2.配置之前需将计算机名更改为后面题目中所要求的. 3.一些版本之中比如Windows Server2012之中搭建域之后重启会显示…...

Python 3.14:探索新版本的魅力与革新

在Python编程语言的不断演进中,Python 3.14作为又一重要里程碑,承载着开发者们的期待与热情,悄然走进了我们的视野。尽管在撰写本文时,Python 3.14可能尚未正式成为主流版本(注:实际发布情况需根据最新信息…...

LabVIEW基于VI Server的控件引用操作

本 VI 通过展示控件引用(Control References)的使用,借助 VI Server 实现对前面板对象的编程操作。 ​ 详细说明 隐式属性节点(Implicitly Linked Property Node):通过右键单击控件(或其控件终…...

【不同名字的yolo的yaml文件名是什么意思】

以下是这些 YOLO 系列配置文件的详细解析,按版本和功能分类说明: 一、YOLOv3 系列 文件名核心特性适用场景yolov3.yaml原始 YOLOv3 结构,3 尺度预测(13x13,26x26,52x52)通用目标检测yolov3-spp.yaml增加 SPP&#xff…...

《100天精通Python——基础篇 2025 第3天:变量与数据类型全面解析,掌握Python核心语法》

目录 一、Python变量的定义和使用二、Python整数类型(int)详解三、Python小数/浮点数(float)类型详解四、Python复数类型(complex)详解---了解五、Python字符串详解(包含长字符串和原始字符串)5.1 处理字符串中的引号5.2 字符串的…...

精益数据分析(24/126):聚焦第一关键指标,驱动创业成功

精益数据分析(24/126):聚焦第一关键指标,驱动创业成功 在创业和数据分析的探索之旅中,我们都在不断寻找能够助力成功的关键因素。今天,我依旧带着与大家共同进步的初心,深入解读《精益数据分析…...

【刷题Day26】Linux命令、分段分页和中断(浅)

说下你常用的 Linux 命令? 文件与目录操作: ls:列出当前目录的文件和子目录,常用参数如-l(详细信息)、-a(包括隐藏文件)cd:切换目录,用于在文件系统中导航m…...

互联网实验室的质量管控痛点 质检LIMS系统在互联网企业的应用

在互联网行业流量红利消退与用户体验至上的时代背景下,产品迭代速度与质量稳定性成为企业核心竞争力的分水岭。传统测试实验室依赖人工操作、碎片化工具与线下沟通的管理模式,已难以应对敏捷开发、多端适配、数据安全等复合型挑战。 一、互联网实验室的…...

VScode远程连接服务器(免密登录)

一、本机生成密钥对 本地终端输入ssh-keygen,生成公钥(id_rsa.pub)和私钥(id_rsa) 二、在远程服务器根目录的.ssh文件夹的authorized_keys中输入id_rsa的内容 三、修改vscode的config文件.ssh/config,加…...

【Go语言】RPC 使用指南(初学者版)

RPC(Remote Procedure Call,远程过程调用)是一种计算机通信协议,允许程序调用另一台计算机上的子程序,就像调用本地程序一样。Go 语言内置了 RPC 支持,下面我会详细介绍如何使用。 一、基本概念 在 Go 中&…...

安卓四大组件之ContentProvider

目录 实现步骤 代码分析 onCreate insert query ContextHolder Cursor 作用与用法 基本步骤: 可能的面试题:为什么使用Cursor? 为什么使用Cursor 使用Cursor的好处 静态内部类实现单例模式 AnndroidManifest.xml配置信息 注释的…...

C#中实现XML解析器

XML(可扩展标记语言)是一种广泛用于存储和传输数据的格式,因其具有良好的可读性和可扩展性,在许多领域都有应用。 实现思路: 词法分析 词法分析的目的是将输入的 XML 字符串分解为一个个的词法单元,例如…...

神经符号混合与跨模态对齐:Manus AI如何重构多语言手写识别的技术边界

在全球化数字浪潮下,手写识别技术长期面临"巴别塔困境"——人类书写系统的多样性(从中文象形文字到阿拉伯语连写体)与个体书写风格的随机性,构成了人工智能难以逾越的双重壁垒。传统OCR技术在处理多语言手写场景时,准确率往往不足70%,特别是在医疗处方、古代文…...

TestBrain开源程序是一款集使用AI(如deepseek)大模型自动生成测试用例、和测试用例评审、RAG知识库管理的web平台系统

一、软件介绍 文末提供程序和源码下载 TestBrain开源程序是一款集使用AI(如deepseek)大模型自动生成测试用例、和测试用例评审、RAG知识库管理的web平台系统一个基于LLM的智能测试用例生成平台(功能慢慢丰富中,未来可能将测试相关的所有活动集成到一起)&#xff0c…...

软件工程效率优化:一个分层解耦与熵减驱动的系统框架

软件工程效率优化:一个分层解耦与熵减驱动的系统框架** 摘要 (Abstract) 本报告构建了一个全面、深入、分层的软件工程效率优化框架,旨在超越简单的技术罗列,从根本的价值驱动和熵减原理出发,系统性地探讨提升效率的策略与实践。…...

【金仓数据库征文】- 深耕国产数据库优化,筑牢用户体验新高度

目录 引言 一、性能优化:突破数据处理极限,提升运行效率 1.1 智能查询优化器:精准优化数据检索路径 1.2 并行处理技术:充分释放多核计算潜力 1.3 智能缓存机制:加速数据访问速度 二、稳定性提升:筑牢…...

前端面试常见部分问题,及高阶部分问题

面试中也极有可能让你徒手写代码,无聊的面试问题o( ̄︶ ̄)o 一、HTML/CSS 基础与进阶 常见问题 什么是语义化标签?有哪些常用语义化标签? 答案:语义化标签是指具有明确含义的 HTML 标签,如 <header>、<footer>、<article>、<section> 等。它们有…...

使用 AutoGen 与 Elasticsearch

作者&#xff1a;来自 Elastic Jeffrey Rengifo 学习如何使用 AutoGen 为你的 agent 创建一个 Elasticsearch 工具。 Elasticsearch 拥有与行业领先的生成式 AI 工具和提供商的原生集成。查看我们的网络研讨会&#xff0c;了解如何超越 RAG 基础&#xff0c;或使用 Elastic 向量…...

kafka与flume的整合、spark-streaming

kafka与flume的整合 前期配置完毕&#xff0c;开启集群 需求1&#xff1a; 利用flume监控某目录中新生成的文件&#xff0c;将监控到的变更数据发送给kafka&#xff0c;kafka将收到的数据打印到控制台&#xff08;三个node01中运行&#xff09; 1.在kafka中建立topic kafka…...

高级电影感户外街拍人像摄影后期Lr调色教程,手机滤镜PS+Lightroom预设下载!

调色介绍 高级电影感户外街拍人像摄影后期 Lr 调色&#xff0c;是运用 Adobe Lightroom 软件&#xff0c;对户外街拍的人像照片进行后期处理&#xff0c;以塑造出具有电影质感的独特视觉效果。此调色过程借助 Lr 丰富的工具与功能&#xff0c;从色彩、光影、对比度等多维度着手…...

react 常用钩子 hooks 总结

文章目录 React钩子概念图状态管理钩子 state management副作用钩子 effect hooks引用钩子 Ref hooks上下文钩子其他钩子过渡钩子 处理过渡效果性能优化钩子 performance hooksReact 19 新钩子 React钩子概念图 状态管理钩子 state management useState useReducer useSyncEx…...

2025 年导游证报考条件新政策解读与应对策略

2025 年导游证报考政策有了不少新变化&#xff0c;这些变化会对报考者产生哪些影响&#xff1f;我们又该如何应对&#xff1f;下面就为大家详细解读新政策&#xff0c;并提供实用的应对策略。 最引人注目的变化当属中职旅游类专业学生的报考政策。以往&#xff0c;中专学历报考…...

重置 Git 项目并清除提交历史

在某些情况下&#xff0c;你可能需要完全重置一个 Git 项目&#xff0c;清除所有提交历史&#xff0c;然后将当前代码作为全新的初始提交。本文将详细介绍这个过程的操作步骤和注意事项。 重要警告 ⚠️ 注意&#xff1a;以下操作将永久删除项目的所有提交历史、分支和标签。…...

GitHub Copilot (Gen-AI) 很有用,但不是很好

摘要&#xff1a;以下是我在过去三个月中在实际 、 开发中使用 GitHub Copilot Pro 后的想法。由于技术发展迅速&#xff0c;值得注意的是&#xff0c;这些印象是基于我截至 2025 年 3 月的经验。 1 免费试用促使我订阅 GitHub Copilot Pro 我以前读过有关 AI 代码生成器的文…...

K8S Service 原理、案例

一、理论介绍 1.1、3W 法则 1、是什么&#xff1f; Service 是一种为一组功能相同的 pod 提供单一不变的接入点的资源。当 Service 存在时&#xff0c;它的IP地址和端口不会改变。客户端通过IP地址和端口号与 Service 建立连接&#xff0c;这些连接会被路由到提供该 Service 的…...

Base64编码原理:二进制数据与文本的转换技术

&#x1f504; Base64编码原理&#xff1a;二进制数据与文本的转换技术 开发者的数据编码困境 作为开发者&#xff0c;你是否曾遇到这些与Base64相关的挑战&#xff1a; &#x1f4ca; 需要在JSON中传输二进制数据&#xff0c;但不确定如何正确编码&#x1f5bc;️ 想要在HT…...

系统设计(1)—前端—CDN—Nginx—服务集群

简介&#xff1a; 本指南旨涵盖前端、CDN、Nginx 负载均衡、服务集群、Redis 缓存、消息队列、数据库设计、熔断限流降级以及系统优化等模块的核心要点。我们将介绍各模块常见的设计方案与优化策略&#xff0c;并结合电商秒杀、SaaS CRM 系统、支付系统等高并发场景讨论实践技巧…...

Easysearch 基础运维扫盲指南:从 HTTP 到 HTTPS、认证与安全访问全解析

Easysearch 基础运维扫盲指南&#xff1a;从 HTTP 到 HTTPS、认证与安全访问全解析 众所周知&#xff0c;原生 Elasticsearch 默认开启的是 HTTP 明文接口&#xff0c;并且不开启任何身份认证或传输加密。若想启用 TLS/SSL 加密及账号密码验证&#xff0c;通常需要配置繁琐的安…...

在Android中如何使用Protobuf上传协议

在 Android 中使用 Protobuf&#xff08;Protocol Buffers&#xff09;主要分为以下几个步骤&#xff1a; ✅ 1. 添加 Protobuf 插件和依赖 在项目的 build.gradle&#xff08;Project 级&#xff09;文件中添加 Google 的 Maven 仓库&#xff08;通常默认已有&#xff09;&am…...

【数据可视化艺术·应用篇】三维管线分析如何重构城市“生命线“管理?

在智慧城市、能源管理、工业4.0等领域的快速发展中&#xff0c;地下管线、工业管道、电力通信网络等“城市血管”的复杂性呈指数级增长。传统二维管理模式已难以应对跨层级、多维度、动态变化的管线管理需求。三维管线分析技术应运而生&#xff0c;成为破解这一难题的核心工具。…...

2025年的营销趋势-矩阵IP

从 2025 年的营销生态来看&#xff0c;创始人 IP 与智能矩阵的结合确实呈现出颠覆性趋势&#xff0c;这一现象背后隐藏着三个值得深度解析的商业逻辑&#xff1a; 一、创始人 IP 的本质是 "信任货币" 的数字化迁徙 当新能源汽车市场陷入参数混战&#xff0c;雷军将个…...

对接金蝶获取接口授权代码

接口服务信息 using RestSharp; using System.Configuration; using System.Threading.Tasks; public class KingdeeAccessTokenService { private readonly RestClient _client; private readonly KingdeeApiConfig _config; public KingdeeAccessTokenService() …...

探秘 3D 展厅之卓越优势,解锁沉浸式体验新境界

&#xff08;一&#xff09;打破时空枷锁&#xff0c;全球触达​ 3D 展厅的首要优势便是打破了时空限制。在传统展厅中&#xff0c;观众需要亲临现场&#xff0c;且必须在展厅开放的特定时间内参观。而 3D 展厅依托互联网&#xff0c;让观众无论身处世界哪个角落&#xff0c;只…...

prometheus通过Endpoints自定义grafana的dashboard模块

1、prometheus自定义的dashboard模块 文件路径/etc/prometheus/config_out/prometheus-env.yaml - job_name: serviceMonitor/monitoring/pfil/0honor_labels: falsekubernetes_sd_configs:- role: endpointsnamespaces:names:- monitoringrelabel_configs:- source_labels:- …...

java排序算法-计数排序

计数排序的思路 计数排序的基本思路&#xff1a; 确定取值范围&#xff1a; 遍历整个待排序的数组&#xff0c;确定数组中元素的取值范围&#xff0c;找到最小值和最大值。创建计数数组&#xff1a; 创建一个计数数组&#xff0c;其长度为取值范围的大小&#xff0c;用于统计…...