山东大学计算机图形学期末复习15——CG15

CG15

OpenGL缓冲区、读写操作以及混合(Blending)

一、OpenGL缓冲区概述

OpenGL中的缓冲区是用于存储像素数据的内存区域,主要包括以下类型:

  • 颜色缓冲区(Color Buffer):存储每个像素的颜色值。
  • 深度缓冲区(Depth Buffer):存储每个像素的深度信息,用于深度测试。
  • 模板缓冲区(Stencil Buffer):用于复杂的像素操作,如遮罩和多重渲染通道控制。
  • 累积缓冲区(Accumulation Buffer):用于图像的累积操作,如抗锯齿、模糊等。
  • 辅助缓冲区(Auxiliary Buffer):提供额外的渲染目标。
  • 覆盖缓冲区(Overlay Buffer):用于显示覆盖内容,如HUD界面。

这些缓冲区共同构成了帧缓冲区(Frame Buffer),是OpenGL渲染管线的核心部分。

二、缓冲区的定义

一个缓冲区由以下参数定义:

  • 空间分辨率:宽度(n)×高度(m),例如1920×1080。
  • 颜色深度(k):每个像素的位数,决定颜色或数据的精度。例如,8位/像素表示256种灰度级别,24位/像素(RGB各8位)表示16.7百万种颜色。

这些参数决定了缓冲区的存储容量和显示精度。

三、OpenGL帧缓冲区结构

帧缓冲区是OpenGL中用于存储最终渲染图像的内存区域,由多个子缓冲区组成:

  • 前缓冲区(Front Buffer):当前显示在屏幕上的内容。
  • 后缓冲区(Back Buffer):用于后台渲染,完成后与前缓冲区交换,避免闪烁。
  • 深度缓冲区(Depth Buffer):用于深度测试,决定像素的可见性。
  • 模板缓冲区(Stencil Buffer):用于控制像素是否被绘制,常用于复杂渲染效果。

通过这些缓冲区的协同工作,OpenGL实现了高效的图形渲染。

四、缓冲区的读写操作

写入前读取目标像素,使用组合函数:
d ′ = f ( s , d ) d' = f(s, d) d=f(s,d)

  • s s s:源像素(来自CPU或纹理)
  • d d d:目标像素(帧缓冲区已有)
  • f f f:如替换、加法、XOR等逻辑运算
1. 写入缓冲区

OpenGL提供了多种函数用于将数据写入缓冲区:

// 设置清除颜色
glClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);// 清除颜色缓冲区
glClear(GL_COLOR_BUFFER_BIT);

对于更复杂的写入操作,可以使用以下函数:

// 写入像素数据
glDrawPixels(GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels);
2. 读取缓冲区

从缓冲区读取数据的函数包括:

// 读取像素数据
glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels);

在读取之前,可以指定读取的缓冲区:

// 指定读取的缓冲区
glReadBuffer(GLenum mode); // 例如:GL_FRONT, GL_BACK

这些操作允许在应用程序中获取渲染结果,用于后续处理或保存。

五、混合(Blending)技术

混合是指在渲染时将源颜色(即将要绘制的颜色)与目标颜色(即当前缓冲区中的颜色)按照一定规则进行组合的过程,常用于实现透明效果或颜色叠加。

1. 启用混合

在使用混合功能前,需要启用混合:

glEnable(GL_BLEND);
2. 设置混合函数

混合函数定义了源颜色和目标颜色的组合方式:

glBlendFunc(GLenum sfactor, GLenum dfactor);

常用的参数包括:

  • GL_ZERO:因子为0。
  • GL_ONE:因子为1。
  • GL_SRC_ALPHA:源颜色的alpha值。
  • GL_ONE_MINUS_SRC_ALPHA:1减去源颜色的alpha值。

例如,实现标准的alpha混合:

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
3. 混合公式

混合的数学公式如下:

C r e s u l t = C s r c × F s r c + C d s t × F d s t C_{result} = C_{src} \times F_{src} + C_{dst} \times F_{dst} Cresult=Csrc×Fsrc+Cdst×Fdst

其中:

  • C r e s u l t C_{result} Cresult:混合后的颜色。
  • C s r c C_{src} Csrc:源颜色。
  • C d s t C_{dst} Cdst:目标颜色。
  • F s r c F_{src} Fsrc:源因子。
  • F d s t F_{dst} Fdst:目标因子。

通过调整混合函数的参数,可以实现多种视觉效果。

六、逻辑操作(Logical Operations)
  • XOR交换机制(三次异或可以无损交换两块数据):

    S = S ⊕ M;
    M = S ⊕ M;
    S = S ⊕ M;
    

OpenGL提供了逻辑操作功能,用于在像素级别进行位操作,如异或(XOR)、与(AND)、或(OR)等。

在这里插入图片描述

1. 启用逻辑操作

在使用逻辑操作前,需要启用该功能:

glEnable(GL_COLOR_LOGIC_OP);
2. 设置逻辑操作模式

使用glLogicOp函数设置逻辑操作模式:

glLogicOp(GLenum opcode);

常用的操作码包括:

  • GL_COPY:直接复制源颜色。
  • GL_XOR:源颜色与目标颜色进行异或操作。
  • GL_AND:源颜色与目标颜色进行与操作。
  • GL_OR:源颜色与目标颜色进行或操作。

例如,使用异或操作:

glLogicOp(GL_XOR);

需要注意,启用逻辑操作后,混合功能将被禁用。

七、位图(Bitmap)操作

位图(bitmap)是 1位图像,作为掩码使用:

  • 0 → 不修改帧缓冲区
  • 1 → 用当前光栅颜色绘制

典型用途:

  • 文本渲染(GLUT字体)
  • 光标显示

OpenGL提供了glBitmap函数,用于绘制1位像素的位图,常用于渲染文本或简单图形。

1. 使用glBitmap绘制位图

函数定义:

void glBitmap(GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap);

参数说明:

  • width, height:位图的宽度和高度。
  • xorig, yorig:位图原点相对于当前光栅位置的偏移。
  • xmove, ymove:绘制位图后,光栅位置的移动量。
  • bitmap:位图数据。

使用示例:

glRasterPos2f(x, y); // 设置光栅位置
glBitmap(width, height, xorig, yorig, xmove, ymove, bitmap);

这将在指定位置绘制位图,并更新光栅位置。

文本绘制与像素操作

一、OpenGL中文本绘制(第19页)
1. 文本渲染方式

OpenGL 支持两种主要文本渲染方式:

  • 光栅文本(Raster Text)
    • 使用位图(bitmap)表示字符;
    • 渲染速度快,适合实时应用;
    • 不能放大缩小(不具备矢量特性);
    • 实现函数:glutBitmapCharacter()
  • 向量文本(Vector Text)
    • 使用轮廓曲线或多边形定义字符;
    • 可缩放和旋转,但渲染开销大;
    • 常用于打印、高质量文本展示;
    • 实现函数:如 glutStrokeCharacter()
2. 字体与字号
  • 示例字体:Times, Courier, Computer Modern
  • 字体大小使用 点(pt) 表示,1 英寸 = 72 点;
    • 10pt、24pt 等常用;
    • 24pt 在72DPI的显示器上约高1/3英寸。
二、位图图形与绘制示例
棋盘格位图示例
GLubyte wb[2] = {0x00, 0xFF}; // 黑白色像素
GLubyte check[512]; // 512字节,表示64×64位图for (i = 0; i < 64; i++) {for (j = 0; j < 8; j++) {check[i * 8 + j] = wb[(i / 8 + j) % 2];}
}
glBitmap(64, 64, 0.0, 0.0, 0.0, 0.0, check);
  • 每字节表示8个像素(1个位 = 1像素);
  • 使用 glBitmap 绘制此图案。
三、图像格式支持(第21~25页)
OpenGL与图像格式

OpenGL 只处理原始像素数据,不直接支持如 JPEG、TIFF 等格式。

格式特点OpenGL处理方式
JPEG有损压缩,压缩率高解码为RGB数组
TIFF无损压缩,适合高质量图像解码为像素数组
GIF256色索引图像,支持简单动画解码为RGB或灰度
PS/EPS矢量格式,常用于出版不能直接使用,需转为像素
PPM原始像素格式,易解析适合教学或快速测试

结论:需借助第三方库如 SOIL、stb_image、FreeImage 进行图像加载。

四、图像扭曲与矢量化引导
图像的数学定义(第26页)
  • 图像是二维函数 I ( x , y ) I(x, y) I(x,y),每个坐标点对应颜色值;
  • 在计算机中是离散的,即 f ( i , j ) f(i, j) f(i,j)
  • 这种定义为图像处理与分析提供数学基础。
五、图像大小与格式压缩对比(第32页)
  • 示例图像:1200 × 1200 像素(RGB,每像素3字节);
  • 原始未压缩大小 ≈ 4.12 MB;
  • 使用 TIFF(无损压缩)后 ≈ 1.37 MB;
  • 说明:压缩格式显著降低存储大小,但需转换为原始数据才能在 OpenGL 中使用。
六、OpenGL像素图像处理流程
像素基本概念
  • OpenGL 支持的图像类型:
    • 灰度图:1字节/像素;
    • RGB 图:3字节/像素;
  • 支持三种像素操作:
    1. 绘制像素(glDrawPixels)
    2. 读取像素(glReadPixels)
    3. 复制像素(glCopyPixels)
像素格式与类型
  • 像素格式:GL_RGB, GL_RGBA, GL_COLOR_INDEX
  • 数据类型:GL_UNSIGNED_BYTE, GL_FLOAT
  • 函数:glPixelMap 可实现像素值的映射与替换(颜色替换、亮度调整等)。
像素读写函数
// 读取像素
glReadPixels(x, y, width, height, format, type, data);// 绘制像素
glDrawPixels(width, height, format, type, data);
  • 用于图像保存、截图或离屏处理。
图像数据缩放
glPixelTransferf(GL_RED_SCALE, s);
glPixelTransferf(GL_GREEN_SCALE, s);
glPixelTransferf(GL_BLUE_SCALE, s);
  • 调整颜色通道的缩放因子 s s s,用于图像增强;
  • 开启字节交换以适应不同平台字节序:
glPixelStorei(GL_UNPACK_SWAP_BYTES, GL_TRUE);
像素读取示例
glReadPixels(200, 200, 200, 200, GL_RGB, GL_UNSIGNED_BYTE, p);
  • 将中心区域200×200像素读取到内存,存入 char p[120000]
像素绘制示例
glRasterPos2f(-1.0, -1.0);
glDrawPixels(200, 200, GL_RGB, GL_UNSIGNED_BYTE, p);
  • 将刚才读取的数据绘制到窗口左下角,实现“像素复制”。
图像缩放(第39页)
glPixelZoom(xscale, yscale);
  • 控制 glDrawPixels 的缩放比例;

  • xscale/yscale:

    • 1:放大;

    • <1:缩小;

    • <0:翻转;

示例:

glPixelZoom(2.0, 2.0); // 放大2倍
glPixelZoom(0.5, 0.5); // 缩小1/2
显示回调函数
void display() {glClear(GL_COLOR_BUFFER_BIT);glRasterPos2i(0, 0);glDrawPixels(n, m, GL_RGB, GL_UNSIGNED_INT, image);glFlush();
}
  • 用于注册到 GLUT 显示回调;
  • 核心流程包括:清屏 → 设置光栅位置 → 绘图 → 刷新

Convex and Compact Superpixels byEdge-Constrained Centroidal Power Diagram

一、基本背景:什么是“超像素”?

在图像处理中,**像素(pixel)**是图像的最小单元,每个像素表示一个颜色值。但是像素是按网格排列的,不携带高级结构信息。

于是人们提出了**超像素(superpixel)**的概念:

  • 将相邻、颜色或纹理相似的像素聚合成一个区域。
  • 每个区域就称为一个“超像素”。
  • 好处是:更紧凑的表示、更少的计算、更易于分析。

举例:

  • 100x100像素图像有1万个像素。
  • 用200个超像素表示它,可以显著减少处理开销。
  • 在目标检测、分割、压缩中,超像素是常用的预处理步骤。
二、动机:为什么要“凸且紧凑”的超像素?

“凸”(convex)意味着一个区域中任意两点之间的直线仍在区域内部,这种形状:

  • 更规则,边界清晰。
  • 更适合后续矢量化对象检测

“紧凑”(compact)意味着区域面积小,形状接近圆形或正方形:

  • 降低冗余。
  • 保持每个区域的信息集中。
三、传统方法:Voronoi图与质心Voronoi图(CVT)

**Voronoi图(Voronoi Diagram)**是一个经典的几何工具:

给定一组点(称为“站点”),它把空间划分为若干个区域,使得:

每个区域包含所有离某个站点最近的点。

数学定义:
v i = { x ∈ Ω ∣ ∥ x − x i ∥ ≤ ∥ x − x j ∥ , ∀ j ≠ i } v_i = \{ x \in \Omega \mid \|x - x_i\| \leq \|x - x_j\|,\ \forall j \neq i \} vi={xΩxxixxj, j=i}
进一步优化后,就得到:

质心Voronoi图(Centroidal Voronoi Tessellation, CVT):
  • 每个站点位于其区域的“质心”上。
  • 实现区域形状优化,使区域更规则、对称。

但问题是:CVT无法直接控制区域大小,不利于图像复杂区域的自适应划分。

四、改进:功率图(Power Diagram)与质心功率图(CPD)

**功率图(Power Diagram)**是在Voronoi图上加权:

数学形式:
v i pow = { x ∈ Ω ∣ ∥ x − x i ∥ 2 − w i ≤ ∥ x − x j ∥ 2 − w j } v_i^{\text{pow}} = \{ x \in \Omega \mid \|x - x_i\|^2 - w_i \leq \|x - x_j\|^2 - w_j \} vipow={xΩxxi2wixxj2wj}
特点:

  • 每个站点x_i有一个权重w_i。
  • 权重越大,对应的区域越小。
  • 可以控制每个超像素的大小。

结合CVT与功率图,就得到:

质心功率图(Centroidal Power Diagram, CPD)
  • 站点位于其功率区域的质心。
  • 引入权重,使区域大小可调节。
五、ECCPD算法:论文核心方法

ECCPD = Edge-Constrained Centroidal Power Diagram

(1)优化目标函数:

E ( X , W ) = ∑ i = 1 N ∫ P W i ∥ x − x i ∥ 2 d σ + λ ∑ i = 1 N ( w i − Weight ( x i ) ) 2 E(X, W) = \sum_{i=1}^{N} \int_{P_{W_i}} \|x - x_i\|^2 d\sigma + \lambda \sum_{i=1}^N (w_i - \text{Weight}(x_i))^2 E(X,W)=i=1NPWixxi2dσ+λi=1N(wiWeight(xi))2

解释:

  • 第一项:区域内点到站点的距离平方和 → 控制紧凑性。
  • 第二项:当前权重与图像特征(如边缘、颜色)的偏差平方和 → 控制适应性。
  • λ:平衡这两部分的系数。

最终目标:调整站点位置x_i和权重w_i,使E最小

六、ECCPD算法流程
  1. 初始化:
    • 输入图像。
    • 设定初始站点位置(随机或边缘引导)。
    • 分配初始权重(可设为常数或边缘相关)。
  2. 迭代优化:
    • 计算每个区域的质心。
    • 调整站点到质心。
    • 更新权重。
  3. 后处理:
    • 使边界与图像边缘对齐。
    • 修正区域形状以提高凸性。
七、权重函数的设计:结合图像内容自适应

使用了距离场函数
Dist ( p ) = v ⋅ Eudist ( p ) \text{Dist}(p) = v \cdot \text{Eudist}(p) Dist(p)=vEudist(p)
含义:

  • Eudist§:点p到最近边缘的欧氏距离。
  • v:缩放因子(越大则边缘区域更小)。

效果:

  • 边缘区域(Eudist小)→ 超像素小 → 保留边缘细节。
  • 内部区域(Eudist大)→ 超像素大 → 减少不必要的细节。

还结合了颜色差异,调整相邻区域颜色差异大的权重,增强内容敏感性。

八、实验分析与结果可视化
  • 数据集:BSDS500, PASCAL-S。
  • 评估指标:
    • COM:紧凑性(越高越好)。
    • BR:边界召回率。
    • USE:未分割率(越低越好)。
    • ASA:平均分割精度(越高越好)。

结果显示:ECCPD在保持高精度的同时,紧凑性领先于所有对比方法

九、应用举例
1. 图像压缩:
  • 用几千个凸超像素替代十几万像素。
  • 减少存储或传输成本。
2. 多边形轮廓提取:
  • 每个凸超像素是多边形 → 可直接提取对象轮廓。

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

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

相关文章

html+css+js趣味小游戏~记忆卡片配对(附源码)

下面是一个简单的记忆卡片配对游戏的完整代码&#xff0c;使用HTML、CSS和JavaScript实现&#xff1a; html <!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><meta name"viewport" content"wid…

⼀个并发访问量⽐较⼤的key在某个时间过期,在redis中这个时间过期什么意思

在 Redis 中&#xff0c;当提到一个键&#xff08;key&#xff09;“在这个时间过期”&#xff0c;指的是为该键设置了生存时间&#xff08;TTL, Time To Live&#xff09;或过期时间&#xff08;expiration time&#xff09;。一旦到达设定的过期时间&#xff0c;Redis 会自动…

【设计模式】- 行为型模式1

模板方法模式 定义了一个操作中的算法骨架&#xff0c;将算法的一些步骤推迟到子类&#xff0c;使得子类可以不改变该算法结构的情况下重定义该算法的某些步骤 【主要角色】&#xff1a; 抽象类&#xff1a;给出一个算法的轮廓和骨架&#xff08;包括一个模板方法 和 若干基…

ubuntu22.04 卸载ESP-IDF

要在Ubuntu 22.04上完全卸载ESP-IDF&#xff0c;请按照以下步骤操作&#xff1a; 卸载ESP-IDF的步骤 删除ESP-IDF目录&#xff1a; # 假设ESP-IDF安装在~/esp/esp-idf目录 rm -rf ~/esp/esp-idf删除ESP-IDF工具链和下载的工具&#xff1a; rm -rf ~/.espressif从PATH中移除ESP…

SQLMesh 内置宏详解:@PIVOT等常用宏的核心用法与示例

本文系统解析 SQLMesh 的四个核心内置宏&#xff0c;涵盖行列转换的 PIVOT、精准去重的 DEDUPLICATE、灵活生成日期范围的 DATE_SPINE&#xff0c;以及动态表路径解析的 RESOLVE_TEMPLATE。通过真实案例演示参数配置与 SQL 渲染逻辑&#xff0c;并对比宏调用与传统 SQL 的差异&…

基于Springboot + vue3实现的工商局商家管理系统

项目描述 本系统包含管理员、商家两个角色。 管理员角色&#xff1a; 用户管理&#xff1a;管理系统中所有用户的信息&#xff0c;包括添加、删除和修改用户。 许可证申请管理&#xff1a;管理商家的许可证申请&#xff0c;包括搜索、修改或删除许可证申请。 许可证审批管理…

第五部分:第五节 - Express 路由与中间件进阶:厨房的分工与异常处理

随着你的 Express 应用变得越来越大&#xff0c;所有的路由和中间件都写在一个文件里会变得难以管理。这时候就需要将代码进行拆分和组织。此外&#xff0c;一个健壮的后端应用必须能够优雅地处理错误和一些常见的 Web 开发问题&#xff0c;比如跨域。 路由模块化 (express.Ro…

萌新联赛第(三)场

C题 这道题用暴力去写想都不要想&#xff0c;一定超时&#xff0c;于是我们需要优化&#xff0c;下面是思路过程&#xff1a; 如图&#xff0c;本题只需找到x的因数个数和(n-x)的因数个数&#xff0c;这两个相乘&#xff0c;得到的就是对于这个x来说组合的个数&#xff0c;且x…

【Android构建系统】如何在Camera Hal的Android.bp中选择性引用某个模块

背景描述 本篇文章是一个Android.bp中选择性引用某个模块的实例。 如果是Android.mk编译时期&#xff0c;在编译阶段通过某个条件判断是不是引用某个模块A, 是比较好实现的。Android15使用Android.bp构建后&#xff0c;要想在Android.bp中通过自定义的一个变量或者条件实现选…

【OneNET】_01_使用微信小程序通过新版OneNET平台获取STM32设备信息并进行控制

【OneNET】_01_使用微信小程序通过新版OneNET平台获取STM32设备信息并进行控制 一、 前言1.1 OntNET硬件方面: STM32F103C8T6 ESP01S教程 1.2 微信小程序方面 二、STM32代码部分修改三、微信小程序修改的部分四、小笔记&#xff08;个人杂记&#xff09;4.1 OneNETOneNET物联网…

用 python 编写的一个图片自动分类小程序(三)

图片自动分类识别小程序记录 2025/5/18 0:38修改程序界面&#xff0c;增加一些功能 用 python 编写的一个图片自动识别分类小程序。 操作系统平台&#xff1a;Microsoft Windows 11 编程语言和 IDE&#xff1a;python 3.10 Visual studio code 一&#xff1a;图片自动分…

嵌入式硬件篇---SGP30 气体传感器

文章目录 前言一、SGP30 气体传感器详解(一)基本概述(二)工作原理传感器结构检测机制自校准功能(三)主要特性(四)应用场景智能家居空气质量检测仪汽车行业商业建筑二、TVOC 与 eCO2 的含义(一)TVOC(总挥发性有机化合物)定义危害健康标准(二)eCO2(等效二氧化碳)…

【原创】ubuntu22.04下载编译AOSP 15

安装依赖的库&#xff0c;顺便把vim 也安装一下 sudo apt-get install vim sudo apt-get install git gnupg flex bison build-essential zip curl zlib1g-dev libc6-dev-i386 x11proto-core-dev libx11-dev lib32z1-dev libgl1-mesa-dev libxml2-utils xsltproc unzip font…

防止勒索病毒的兜底方案——备份

勒索病毒入侵会对您的业务数据进行加密勒索&#xff0c;导致业务中断、数据泄露、数据丢失等&#xff0c;从而带来严重的业务风险。 防止勒索病毒有三个方向&#xff1a; 1&#xff09;实时防御已知勒索病毒 各个云厂商的云安全中心实现了对大量已知勒索病毒的实时防御。在服务…

es在已有历史数据的文档新增加字段操作

新增字段设置默认值 场景 在已经有大量数据的索引文档上&#xff0c;增加新字段 技术实现 一.更新索引映射 通过PUT请求显式定义新字段类型&#xff0c;确保后续写入的文档能被正确解析 PUT /文档名/_mapping {"properties": {"字段名1": {"type…

留给王小川的时间不多了

王小川&#xff0c;这位头顶“天才少年”光环的清华学霸、搜狗输入法创始人、中国互联网初代技术偶像&#xff0c;正迎来人生中最难啃的硬骨头。 他在2023年创立的百川智能&#xff0c;被称为“大模型六小虎”之一。今年4月&#xff0c;王小川在全员信中罕见地反思过去两年工作…

深入掌握MyBatis:连接池、动态SQL、多表查询与缓存

文章目录 一、MyBatis连接池1.1 连接池的作用1.2 MyBatis连接池分类 二、动态SQL2.1 if标签2.2 where标签2.3 foreach标签2.4 SQL片段复用 三、多表查询3.1 多对一查询&#xff08;一对一&#xff09;3.2 一对多查询 四、延迟加载4.1 立即加载 vs 延迟加载4.2 配置延迟加载 五、…

TDesign AI Chat - Vue3.x 可用!腾讯出品的 AIGC 交互对话组件,免费开源、包含设计资源

各位前端开发者有遇到做 AI Chat 项目的聊天交互界面需求了吗&#xff1f;TDesign 出品的这个组件很不错&#xff0c;推荐给大家。 TDesign AI Chat 是 TDesign 为 AIGC 场景开发的 UI 系列组件中的一部分&#xff0c;主要用于开发目前非常流行的 ChatBot 对话交互场景。最近 …

spring -MVC-02

SpringMVC-11 - 响应 在 SpringMVC 中&#xff0c;响应是服务器对客户端请求的反馈&#xff0c;它可以以多种形式呈现&#xff0c;包括视图名称、ModelAndView 对象、JSON 数据以及重定向等。以下是对 SpringMVC 中不同响应类型的详细介绍&#xff1a; 1. 视图名称 通过返回…

老旧设备升级利器:Modbus TCP转 Profinet让能效监控更智能

在工业自动化领域&#xff0c;ModbusTCP和Profinet是两种常见的通讯协议。Profinet是西门子公司推出的基于以太网的实时工业以太网标准&#xff0c;而Modbus则是由施耐德电气提出的全球首个真正开放的、应用于电子控制器上的现场总线协议。这两种协议各有各的优点&#xff0c;但…