计算机图形学入门28:相机、透镜和光场
1.前言
相机(Cameras)、透镜(Lenses)和光场(Light Fields)都是图形学中重要的组成部分。在之前的学习中,都是默认它们的存在,所以现在也需要单独拿出来学习下。
2.成像方法
计算机图形学有两种成像方法,即合成(Synthesis)和捕捉(Capture)。前面学过的光栅化成像和光线追踪成像这两种成像都属于合成(Synthesis)的成像方法,在现实中并不存在。把现实中存在的变成照片属于捕捉(Capture)方法来成像,例如相机。如下图所示。
3.相机
3.1 小孔成像
用一个带有小孔的板遮挡在墙体与物之间,墙体上就会形成物的倒立实像,我们把这样的一种现象叫小孔成像。如果右边放一个传感器,记录到某个胶片上,那么就可以得到一张相片。使用这种原理的相机叫做针孔相机。如下图所示。
当然,我们最常见的还是下图这种这种带棱镜的相机。
3.2 相机部件
3.2.1 相加构成
如上图所示,是一张相机的截面图。相机内部有很多镜头、很多棱镜组成、有感光元件、快门、传感器等。
3.2.2 快门
控制光能否进入机身的部件就是快门(Shutter),并控制光能在1/n秒内进入摄像机。
3.2.3 传感器
光进入相机,相机需要被捕捉到,捕捉的原件叫做传感器(Sensor)。它记录的就是我们之前所说的Irradiance。注意:本篇我们不区分胶片和传感器的概念,但实际上它们是不同的。
如果没有棱镜或者没有针孔,那么相机就不能拍摄一张照片,原因也很简单。如下图所示,如果没有针孔/棱镜,那么传感器上的任何一个点都可能接收人来自四面八方的光线,而传感器本身又不区分方向,所以每个点都收集的是综合起来的信息,所以收集的都是Irradiance信息,看起来都是模糊的。
3.3 针孔相机
小孔成像的现象在很早就被人们发现了,直到今天,我们仍然可以利用小孔成像原理来拍摄照片,使用小孔成像原理的相机叫做针孔相机(Pinhole Camera)。如下图所示,为使用针孔相机拍摄画面。但是小孔成像的照片没有深度,成像的任何一个位置都是锐利的不是虚化的,在光线追踪的时候用的也是针孔相机原理模型。
3.4 视场(FOV)
视场(Field of View)表示的是我们能看到多大的范围,所谓广角镜头也就是FOV更大的镜头。什么因素决定视场呢?我们先从小孔成像理解(忽略棱镜),我们把传感器的高度定义为 h,传感器到小孔的距离定义为 f。如下图所示。
根据三角形关系可以得到FOV=2·arctan(h/2f)。
我们就可以根据内部设计 h 和 f 的参数来调节FOV。如下图所示,通过改变 f 来调整视场大小。
由于历史原因,通常用35mm格式胶片(36 x 24mm)上来定义视场,也就是上面说的传感器大小 h 固定了,那么我们只需要通过定义 f 的不同就可以定义视场的大小,在透镜相机里,f 就是相机的焦距(Focal Length)。所以,焦距短,视场就大,反之视场就小。视场越小,我们能看到的就越远。如下图所示。注意:我们说所有相机都是用35mm的胶片大小,并不是真的所有相机它的胶片大小都是35mm,这里指的是一种等效的大小。
同样的,传感器尺寸也会对视场大小有影响。只不过一般情况下,都是固定传感器大小,调整焦距。如下图所示,当传感器更小的时候(虚线部分),视场也就越小。
对于手机,虽然它的传感器大小小于相机,但是人们通过缩小它的焦距,可以达到和相机一样的视场大小,只不过更大的传感器也就有更大的分辨率。如下图所示。
3.5 曝光
曝光(Exposure),计算公式Exposure=Time x Irradiance。也就是说如果对着明亮的场景拍照会拍到一个明亮的照片,如果对着一个暗的环境拍照,但是按下的快门时间很长,我们也可以得到一个比较明亮的照片。也就是说一个是进了多少光,一个是进光进了多长时间,我们将它们累积起来就可以得到曝光度。照相和辐射度量学不同,我们在辐射度量学中总是定义单位时间,但是照相并不是单位时间内发生的,它记录的是总共的能量。
那么有哪些决定决定曝光呢?首先是光圈大小(Aperture size),光圈的大小决定了进光的多少,而它实际上是一个仿生学的设计,仿照的是人的瞳孔。第二个就是快门(Shutter),快门开放的时间,开放时间越长进光自然也就越多。还有一个是ISO感光度(ISO Gain),它相当于是一个后期处理,简单的说就是接受到的能量我们将它放大多少倍,也就是乘上一个数。
以下详细介绍三者影响曝光的情况。
3.5.1 ISO(Gain)
ISO就是一个后期处理,在最后的图片上乘以一个数,并且是线性的。但是ISO虽然能提升画面的曝光度,但是会导致噪声放大的问题,如下图所示。
从信号的角度理解,我们拍出的照片一定是有噪声的,但是最终我们ISO的操作只是简单的在最后结果上乘了一个数,信号虽然被放大了,但是噪声同样的也被放大了。所以ISO在一定范围内是可以用的,但是过大就会导致噪声问题。
3.5.2光圈大小—F stop
描述光圈的大小有一个专门的数,叫F数,或者F stop。它有两种写法,一个是FN,另一个是F/N。N是我们关心的数,我们可以简单的理解为N就是光圈直径的倒数,N越大光圈直径越小。
3.5.3 快门
快门时间除了会影响曝光度,还会影响一个现象叫做运动模糊。因为按下快门键,快门从关闭状态到打开状态是有一个过程的,它并不是瞬间打开的,而运动模糊的产生就是在快门从开始打开的时候物体开始运动,到快门完全打开的时候它已经运动了一段时间而产生的。因此,曝光时间越长,运动模糊就会越严重,而如果曝光时间相同,那么运动的越快的物体越容易产生运动模糊。如下图所示,快门的时间越长,越模糊。
运动模糊产生也不一定是坏事,比如可以产生物体在移动的效果,或者类似反走样的效果。
快门时间还会造成一种Rolling shutter问题,如下图所示,我们发现飞机的螺旋桨扭曲了。这同样是快门时间导致的,快门打开的过程中,传感器的有些地方先接收到了光,有些地方后接收到了光,于是导致了这种现象。
通过调节影响曝光度的不同因素,我们可以取到很多不同参数而达到相同曝光度的参数。如下图所示,调整每个参数基本都能达到相同的曝光度。
当然它们只是曝光度相同,至于景深,噪声,运动模糊仍具有各自参数的影响。
当用极短的快门时间,通过调大光圈或更大ISO来达到正常曝光度,用来拍摄下高速运动的效果,这就是高速摄影(High-Speed Photography)。如下图所示。
相反的就是用很长的曝光时间和小光圈来拍摄,会产生拉丝的效果,实际上就是运动模糊,能拍摄出显现长时间积累的效果,这就是低速摄影,又叫延时摄影。如下图所示。
4.透镜
4.1 理想薄透镜
实际的透镜(Lens)是非常复杂的,包括相机和手机,它们都是用一组各种各样的透镜组来实现的。如下图所示。
还有一些透镜如下图,它一半是凸的一半是平的,也就是说它不可能把光聚到一块。我们这里讨论的是一种理想化的薄透镜(Ideal Thin Lens)。
关于理想薄透镜有几个性质,如下所示。
1.平行光穿过一定会被聚焦到一个点上,称为焦点。
2.焦点到透镜中心的距离就叫做焦距,同时光路可逆也就意味着一个聚光从焦点发散打到透镜会被变成许多平行光。
3.我们认为这个薄透镜的焦距是可以随时更改,但实际上薄透镜的焦距是已经固定了的,但是我们这里仍然人为它可以更改,因为我们近似的是相机的透镜组,相机的透镜组可以改变组合形式来改变焦距。
如下图所示。
除了上面的性质,还有一个性质就是,光线从透镜中心穿过不改变方向。同时我们定义物体到透镜的距离 z0 (物距),成像到透镜的距离 zi (像距),焦距 f,就可以得出如下的规律等式关系。
推导过程如下。
首先找出两组相似三角形,可得出如下。
然后,将h0、hi挪到一边,因为这两个值不知道,如下。
由此可得。
进一步推导后,得到结果。如下所示。
通过这个薄透镜可以解释很多问题,不需要到实际的透镜组。接下来会介绍这些问题。
4.2 散焦模糊
散焦模糊(Defocus Blur)可以解释景深的问题,我们引入一个概念叫COC (Circle of Confusion)。所谓COC就是远处如果有一个平面Focal Plane,这个平面所有的光通过透镜后会聚焦到一点(最锐利的成像平面),如果要拍摄的物体不在Focal Plane上,如下图所示,物体在后面,那么这个物体就会模糊。因为物体的光通过透镜在成像平面前面就焦距了(薄透镜公式算出),而光线并不会停止前进,而是继续前进而发散,会在成像平面上形成一个圆,这个圆就是COC (Circle of Confusion)。
COC的大小也很好计算,同样根据相似三角形得出下面的式子。如果我们固定这个值,我们会发现,COC的大小和透镜的直径大小A有关。
这也就告诉我们,大光圈会看到更模糊的图像,而小光圈的照片更清晰,如下图所示。
现在我们来明确一下光圈的F数的明确定义,它是焦距/光圈的直径,和我们之前说的光圈直径的倒数有关系,但是它和焦距也有关系。如上图的 f/1.4和 f/22。
以下是真实镜头常见的光圈值(F stops)。注意:f 值为2有时写成 f/2。
明确了F数的定义,那么我们之前说COC大小和A有关,而N又等于f/A,那我们也可以得出另外一个计算COC大小的式子,也就是把A换成f/N。也就是说COC和F数有一个反比关系。如下图所示。
4.3 薄透镜光线追踪
我们之前所说的Path Tracing实际上是默认了小孔成像的模型。而根据我们前面的介绍,我们知道光线是如何与透镜作用的,那我们自然可以模拟透镜去做渲染。如下图所示。
首先我们先定义一些关于透镜的参数,比如成像平面的大小,透镜的焦距,光圈的大小。然后规定透镜放到离场景中的某个平面的物距z0。根据透镜公式,我们自然知道像距zi。如下图所示。
那么,这样就可以进行Path Tracing的操作了。
先在成像平面上个找一点 x',然后在透镜上找一点 x'',根据公式我们就知道,这条经过透镜的光线会打到哪一个点 x''',然后我们连线 x''和 x''',得到它的Radiance,最后记录在 x'上就可以了。
4.4 景深
COC会导致模糊,也就是大光圈会导致大的COC,也就会更模糊,但是总有一些地方是不模糊的,模糊有一个范围,那么怎么定义这个范围呢?这就需要景深(Depth of Field)。
在拍摄的物体前后有一段深度,它相应的在成像平面附近也会形成一片区域,这片区域的COC足够小,小到和我们成像的像素差不多,也就是我们看上去是清晰的不模糊的,那么物体前后那段深度就叫做景深。如下图所示。
景深的计算公式推导如下。
5.光场
5.1 我们看到的是什么
如上图所示,人从房间向窗户外面看过去,能够看到右图所示的2D画面。
那么,如果在房间中间放块幕布,这块幕布能够严格模拟看到的光线从一点到另一点的强度。然后,让这块幕布完全显示出刚才看到的画面,这时候人从看过去完全体会不到与真实世界有区别的,就好像在真正房间里看向窗户外面。因为人眼接收的光没有发生任何变化,这就是虚拟现实的原理。如下图所示。
所以我们看到的东西实际上就是光线,我们的眼睛并不关心光线从多远进来或者从什么地方进来。
5.2 全光函数
全光函数(The Plenoptic Function)用来描述我们看到的所有东西。它是怎么做的呢?我们先从简单的开始说起,假设我们的函数现在是定义了我们在某一个位置往任何方向看到的东西,那么我们可以用P(θ,Φ),用一个球的极坐标表示任何一个方向,我们当然可以定义这么一个函数。如下图所示。
接下来加入一个变量 λ,它表示波长,也就是颜色信息,那我们就能看到彩色的东西了,于是我们的函数变成了P(θ,Φ,λ),我们再加入时间 t,我们的函数就变成了P(θ,Φ,λ,t),引入时间 t 之后等于我们能看到动态的东西了,之前我们只能看到静帧,现在我们能看到动画/电影,也就是可以动的画面。如下图所示。
最后再拓展一个三维空间中的坐标,代表人可以在空间中任何位置朝任何方向看,那也就变成了全息电影,于是函数就变成了P(θ,Φ,λ,t,Vx,Vy,Vz)。如下图所示。
最终我们就得到了这么一个函数,它可以让我们在任何位置朝任何方向在任何时间看不同的颜色,而这就是我们看到的所有东西,一个七个维度的函数,这个七维的函数就是全光函数。
可以从全光函数中提取一部分信息,用来表示更复杂的光。就是在一个点往任何一个方向看,记录了来自各个方向光的信息,所谓光场(Light Field / Lumigraph)就是记录稍微多一些,那么光场就是全光函数的一个小部分。
5.3 光场的定义
5.3.1 光线
定义光场之前,我们先来定义一下光线,就是一个起点和一个方向,一个起点(Vx,Vy,Vz)。一个方向(θ,Φ)。如下图所示。
当然不止只有一种定义光线的方式,还有其他办法。如下图所示,我们用两个点来定义一根光线,当然前提是我们知道方向正负。
5.3.2 光场
对于我们看到的任何一个物体,我们都可以理解为它在一个包围盒里,那我们在任何位置的任何方向都能看到这个物体。又因为光路是可逆的,想要描述这个物体被看到的所有情况,就是可以表示物体在包围盒上在任何位置往任何方向的光线。把这个事情描述清楚,就可以得到从任何一个位置看向这个物体应该是什么样的。如下图所示。
当我们看向物体,包围盒上一个点,观测位置一个点,两个点确定一条光线,又知道方向,这样就可以查询记录的函数。这个函数记录的正是这个物体的任意一个位置朝各个方向发出光的强度,而这就是我们描述的光场。
而光场正是全光函数的一小部分,因为它只有二维的位置和二维的方向。二维的位置指的是物体表面的坐标(u,v),二维的方向指的是(θ,Φ)。
如果我们有了如下图所示一个物体的光场,我们从任意一个位置往物体光场上去看(紫色线),都可以知道看到的什么,这就是光场的好处。
通过一个四维的光场,我们完全可以描述我们在任何位置看到物体表面的任何光的信息,我们之前说的包围盒就是这个意思,我们可以想象用一个黑盒把物体包起来,通过我们之前记录的光场,我们完全不需要知道里面的物体是什么,这和我们一开始说的幕布是一个意思。如下图所示。
1.这种方式也可以这样理解:如果想描述一个光场,我们只需要给定一个平面,平面右边是发光的物体,发出的光穿过平面,我们只需要知道平面左边是什么就可以。也就是对于平面上任何一个点,知道任意一个方向就可以了。这也符合我们之前说的第一种光线的定义,给一个点(u,v)和一个方向(θ,Φ)。如下图所示。
2.那么我们也可以用第二种光线的定义来描述一个光场,我们用两个点,那也就是两个平面,两个平面上各自取一个点,就能确定一条光线,因为我们已经知道了光线一定是朝外的。如下图所示。
两个平面的坐标分别用(u,v)和(s,t)表示,我们发现这并没有本质的区别,因为它们都是四维的,这是个经典的参数化表示方法。如下图所示。
我们对刚才的两个平面定义的光场有两种不同的理解形式。
第一种情况,我们在(u,v)上取不同的坐标,看向(s,t)平面,这也就相当于我们不固定盯着物体的某一个点看,就像相机一样,我们举到哪里相机就拍到哪里,然后我们从各个不同的角度去看向这个物体。如下图所示。
第二种情况,从(s,t)平面的不同位置看向(u,v)平面,或者说从(u,v)平面一侧的不同方向看向(s,t)平面的某个位置,这就相当于我们看物体只盯着物体的某一个点看,即使我们移动了位置,但是我们就盯着那一个固定的点看。如下图所示。
当然上面说的只是一种通俗的理解,自然界中的确有从(s,t)平面看向(u,v)平面的例子,就是苍蝇的复眼。复眼的结构非常复杂,它们由许多独立的更小的眼睛组成,这就好像有一个摄像机矩阵一样,每个复眼将不同方向的光分开记录到不同的位置,如下图左图所示。而这种情况下我们看向一个像素,我们看到的实际是许多的Radiance而不再是Irradiance了。
5.4 光场相机
光场相机(Light Field Camera)就是利用前面提到的光场原理,它把每个像素都替换成了透镜(微透镜),这个透镜可以把来至不同方向的光分开,然后记录下来,每个像素存储Radiance。如下左图所示。右图是拍摄的原始照片。
最重要的功能是支持后期重新调整聚焦,就是先拍照,然后再考虑聚焦或者其他。如下图所示,就是光场相机。
我们拍摄完一张光场照片后,如果想恢复原来的普通照片该怎么做?很简单,只需在每个微透镜上都取来自同一方向的光即可。如下图所示,每个透镜选一个方向的光线,这就好像相机放某个位置向这个方向去照。
如果每个透镜选中间方向的光线,那相机就好像放在中间位置往左边方向照。这就说明有了这个光场之后,就可以虚拟移动相机的位置。也就是说光场相机从一个角度和位置就可以拍摄出许多不同角度和位置的照片。因为光场相机记录整个光场的信息,而整个光场就是进入相机的所有信息,包括位置和方向。
缺点:光场相机通常有分辨率不足的问题。因为原本一个像素记录一个像素的信息,现在需要用更多的像素(微透镜)记录一个像素的信息,因为方向被分开了。也就是原本胶片的分辨率变成原本照片的分辨率乘以方向上的分辨率,方向上分配的像素多,那原本照片的分辨率就低了。所以对胶片的分辨率非常高,微透镜也是十分精密的器件,生产起来成本很高,所以光场相机的成本自然也很高。
由此得到一个体会:如果要记录更精密的方向信息,比如10*10不够,要100*100,这样位置信息就会丢失的更多(留给记录位置的像素就更少了)。所以整个计算机图形学就是关于各方面的权衡。
相关文章:

计算机图形学入门28:相机、透镜和光场
1.前言 相机(Cameras)、透镜(Lenses)和光场(Light Fields)都是图形学中重要的组成部分。在之前的学习中,都是默认它们的存在,所以现在也需要单独拿出来学习下。 2.成像方法 计算机图形学有两种成像方法,即合成(Synthesis)和捕捉(Capture)。前…...

Swift 基于Codable协议使用
Codable协议 继承自 Decodable & Encodable // // Test1.swift // TestDemo // // Created by admin on 2024/7/9. // import Foundationstruct Player{var name:Stringvar highScore:Int 0var history:[Int] []var address:Address?var birthday:Date?init(name: St…...

conda激活的虚拟环境的python版本不对应
这个大坑,要看看虚拟环境下envs下有没有bin文件夹 python -Vecho $PATH镜像源的问题,参考...

深度学习概览
引言 深度学习的定义与背景 深度学习是机器学习的一个子领域,涉及使用多层神经网络分析和学习复杂的数据模式。深度学习的基础可以追溯到20世纪80年代,但真正的发展和广泛应用是在21世纪初。计算能力的提升和大数据的可用性使得深度学习在许多领域取得…...

什么是白盒测试中的静态测试?其包含哪些过程和方法?
文章目录 前言一、文档审查二、软件静态分析1.编码规范检查2.软件质量度量 三、代码审查与代码走查1.代码审查2.代码走查 总结 前言 软件白盒测试中的静态测试是指不运行被测软件,仅通过分析或检查等手段达到检测的目的。在软件白盒测试中,静态测试常通…...

搭建一个高并发的Web商品推荐系统,如何涉及软件架构?
搭建一个高并发的Web商品推荐系统,如何涉及软件架构 在搭建一个高并发的Web商品推荐系统时: 微服务架构: 为了支持高并发,我们可以采用微服务架构,将系统拆分成小型、独立的服务,每个服务专注于特定的功…...

今日科技圈最新时事新闻(2024年7月12日
一、智能硬件与电子产品 小米Redmi G Pro 2024游戏本新版本发布 发布时间:7月12日上午10点产品亮点: 搭载英特尔酷睿i7-14650HX处理器,拥有16个核心和24个线程,性能释放高达130W。配备140W满血释放的RTX 4060显卡,提…...

jenkins系列-09.jpom构建java docker harbor
本地先启动jpom server agent: /Users/jelex/Documents/work/jpom-2.10.40/server-2.10.40-release/bin jelexjelexxudeMacBook-Pro bin % sh Server.sh start/Users/jelex/Documents/work/jpom-2.10.40/agent-2.10.40-release/bin jelexjelexxudeMacBook-Pro bin % ./Agent.…...

构造+贪心,CF 432E,Square Tiling
一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 Problem - 432E - Codeforces 二、解题报告 1、思路分析 很简单的一个构造题 考虑字典序从左到右从上到下,所以我们正常遍历 对于当前格子如果空闲,那么找到一个能填的最小字符 然…...

【Linux】任务管理
这个任务管理(job control)是用在bash环境下的,也就是说:【当我们登录系统获取bashshell之后,在单一终端下同时执行多个任务的操作管理】。 举例来说,我们在登录bash后,可以一边复制文件、一边查…...
计算机网络——常见问题汇总
1. introduction 1.1 Explain what a communication protocol is and why its important. A communication protocol is a set of rules and conventions(公约) that govern(统治) how data is transmitted and received between devices(设备), systems, or entities in a ne…...

Linux的世界 -- 初次接触和一些常见的基本指令
一、Linux的介绍和准备 1、简单介绍下Linux的发展史 1991年10月5日,赫尔辛基大学的一名研究生Linus Benedict Torvalds在一个Usenet新闻组(comp.os.minix)中宣布他编制出了一种类似UNIX的小操作系统,叫Linux。新的操作系统是受到另一个UNIX的…...

[AI 大模型] Meta LLaMA-2
文章目录 [AI 大模型] Meta LLaMA-2简介模型架构发展新技术和优势示例 [AI 大模型] Meta LLaMA-2 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yYHlT342-1720705768360)(https://i-blog.csdnimg.cn/direct/9ddc783e01bf48c3bc784a584339003f.jpeg…...

Python3.6.6 OpenCV 将视频中人物标记或者打马赛克或加图片并保存为不同格式
1、轻松识别视频人物并做出标记 需安装face_recongnition与dlib,过程有点困难,还请网上查找方法 import face_recognition import cv2 #镜像源 -i https://pypi.mirrors.ustc.edu.cn/simple # 加载视频 video_file E:\\videos\\1.mp4 video_capture …...

Readiris PDF Corporate / Business v23 解锁版安装教程 (PDF管理软件)
前言 Readiris PDF Corporate / Business 是一款高性能的 OCR(光学字符识别)软件,能够帮助用户将纸质文档、PDF 文件或图像文件转换为可编辑和可搜索的电子文本。该软件提供专业级的功能和特性,非常适合企业和商业使用。使用 Rea…...

.NET MAUI开源架构_2.什么是 .NET MAUI?
1.什么是.NET MAUI? .NET 多平台应用 UI (.NET MAUI) 是一个跨平台框架,用于使用 C# 和 XAML 创建本机移动和桌面应用。使用 .NET MAUI,可从单个共享代码库开发可在 Android、iOS、macOS 和 Windows 上运行的应用。 .NET MAUI 是一款…...

认知偏差知识手册
The Connector 每周会选取我从信息流里获取的有价值内容,包括 AI 探索专题、Github 开源库推荐、工具介绍和一些文章书籍等,目标是链接互联网上的优质内容,获得更多的灵感和知识,从而激发彼此的创造力。 AI 探索 主流推理框架在…...

SpringBoot后端代码基本逻辑
数据持久化(Dao---Entity---mapper) 配置(application.yml) server:port: 10086 spring:datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://127.0.0.1:3306/wiki?useUnicodetrue&characterEnco…...

Python学生信息管理系统的设计与实现
在本篇博客中,我们将深入探讨一个基于Python的简单学生信息管理系统的设计与实现过程。这个系统允许用户执行诸如添加、删除、修改和查询学生信息等操作。我们将逐步解析代码,理解其中的关键概念和编程实践。 1. 系统概述 该系统由几个核心功能组成&am…...

最优雅的PHP框架 Laravel
Laravel 之所以被称为最优雅的 PHP 框架,是因为它在设计和功能上做了很多独特的创新,极大地提高了开发效率和代码的可维护性。以下是 Laravel 受欢迎的主要原因: 良好的文档和社区支持 Laravel 有详尽的官方文档,涵盖了框架的所有功能和用法。此外,Laravel 社区非常活跃…...

log4j2的日志框架(详细,springboot和异步日志的实现)
目录 log4j2的介绍 Log4j2的性能 SpringBoot中的使用Log4j2 log4j2的进阶--异步日志 AsyncAppender方式 AsyncLogger方式 log4j2的介绍 Apache Log4j 2是对Log4j的升级版,参考了logback的一些优秀的设计,并且修复了一些问题,因此带 来…...

taocms 3.0.1 本地文件泄露漏洞(CVE-2021-44983)
前言 CVE-2021-44983 是一个影响 taoCMS 3.0.1 的远程代码执行(RCE)漏洞。该漏洞允许攻击者通过上传恶意文件并在服务器上执行任意代码来利用这一安全缺陷。 漏洞描述 taoCMS 是一个内容管理系统(CMS),用于创建和管…...

SpringBoot实战:处理全局异常
1. 导入springmvc依赖 2.定义全局异常处理类 //定义全局异常处理器,可捕获控制层抛出的异常 ControllerAdvice public class GlobalExceptionHandler {//当控制层抛出Exception异常时会被该方法捕获,并执行该方法ExceptionHandler(Exception.class)Res…...

pdf只要前几页,pdf中只要前几页怎么处理
在处理pdf文件时,我们有时只需要其中的一页或几页,而不是整个文档。那么,如何快速且高效地从pdf中提取单独的一页呢?本文将为你揭示几种简单易行的方法,让你轻松实现这一目标。 使用 “轻云处理pdf官网” 打开 “轻云…...

实变函数精解【4】
文章目录 说明点集与测度开集的极限点集定义与解释开集的导集特性示例结论 导集一、定义二、特点三、性质四、应用五、总结 边界点与聚点的区别一、定义二、性质与区别三、结论 有界点集与测度有界点集的测度不一定有限分析原因结论注意事项 测度有限的点集,不一定有…...

【BUG】Python3|COPY 指令合并 ts 文件为 mp4 文件时长不对(含三种可执行源代码和解决方法)
文章目录 前言源代码FFmpeg的安装1 下载2 安装 前言 参考: python 合并 ts 视频(三种方法)使用 FFmpeg 合并多个 ts 视频文件转为 mp4 格式 Windows 平台下,用 Python 合并 ts 文件为 mp4 文件常见的有三种方法: 调用…...

AI克隆声音,基于函数计算部署GPT-Sovits语音生成模型
阿里云的基于函数计算部署GPT-Sovits语音生成模型 可以直接文字转语音,也可以上传一段自己的语音,根据你上传的语音进行语音播报。 一、打开阿里云的函数计算 https://developer.aliyun.com/adc/scenario/808348a321844a62b922187d89cd5077 还是 函数…...

DP讨论——建造者模式
学而时习之,温故而知新。 敌人出招(使用场景) 组合关系中,如果要A对象创建B对象,或者要A对象创建一堆对象,这种是普遍的需求。 你出招 这种适合创建者模式,我感觉也是比较常见的。 构造函数…...

【JavaScript】解决 JavaScript 语言报错:Uncaught SyntaxError: Unexpected token
文章目录 一、背景介绍常见场景 二、报错信息解析三、常见原因分析1. 缺少必要的语法元素2. 使用了不正确的字符或符号3. JSON 格式错误4. 字符串未正确闭合 四、解决方案与预防措施1. 检查语法元素2. 正确使用符号和字符3. 修正 JSON 格式4. 字符串闭合 五、示例代码和实践建议…...

oracle数据库的plsql免安装版安装
这个是连接oracle数据库的,注意安装不能有中文路径。以下只是示例。 1、打开D:\ruanjian\plsql\plsql\plsql,发送plsqldev.exe快捷方式到桌面。 2、新弹出的页面填写cancel,什么也不写。 3、将instanceclient解压,并复制文件路径。 修改tool…...