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

掌握Pillow:Python图像处理的艺术

掌握Pillow:Python图像处理的艺术

    • 引言
    • Python与图像处理的概述
    • Pillow库基础
      • 导入Pillow库
      • 基本概念
      • 图像的打开、保存和显示
    • 图像操作基础
      • 图像的剪裁
      • 图像的旋转和缩放
      • 色彩转换和滤镜应用
      • 文字和图形的绘制
    • 高级图像处理
      • 图像的合成与蒙版操作
      • 像素级操作与图像增强
      • 复杂图形和图像的生成
    • Pillow与其他库的结合使用
      • 结合NumPy进行图像数据操作
      • 与Matplotlib结合进行图像展示
    • 实战案例
      • 案例描述
      • 实现步骤
      • 代码实现
    • 总结与展望
      • 文章总结
      • 未来展望
    • 附录:常见问题与解答
      • Q1: Pillow安装失败怎么办?
      • Q2: 如何处理不同格式的图像?
      • Q3: 在处理大量图像时,程序运行缓慢怎么办?
      • Q4: 如何确保图像处理的效率和质量?
      • Q5: Pillow是否支持动态图像处理,如GIF?
      • Q6: 如何处理图像的色彩问题?

在这里插入图片描述

引言

在当今数字时代,图像处理已成为软件开发中不可或缺的一部分。无论是在数据科学、人工智能、网页设计还是日常的应用程序开发中,图像处理都扮演着重要的角色。Python,作为一种功能强大且易于学习的编程语言,提供了多种图像处理库,而Pillow库则是其中最为广泛使用的一个。

Pillow是Python的一个图像处理库,是著名的PIL(Python Imaging Library)库的一个友好分支。它不仅继承了PIL的易用性和强大功能,还加入了许多新的特性和优化。对于从事Python开发的中级和高级开发者来说,无论是处理图像基础操作还是执行复杂的图像处理任务,Pillow都是一个不可或缺的工具。

本文将深入探讨如何使用Pillow库进行高效的图像处理。从基础操作到高级功能,我们将通过丰富的代码示例和详细的解析,带领读者一步步深入了解Pillow的强大能力。无论是新手还是有经验的开发者,都可以从本文中获得宝贵的知识和实践技巧。

接下来的内容将分为几个部分进行介绍。首先,我们将简要介绍Python在图像处理领域的应用以及Pillow库的基本特性。然后,我们将逐步深入到Pillow库的各种操作,包括图像的打开、处理、以及与其他库的结合使用。最后,我们将通过一些实战案例,展示如何在实际项目中运用Pillow解决具体问题。

让我们开始这段图像处理的旅程,揭开Pillow的神秘面纱,一探究竟吧。

Python与图像处理的概述

Python作为一种多功能的编程语言,在图像处理方面拥有广泛的应用。它不仅因其编程简洁性和丰富的库支持受到开发者的青睐,更因为其在处理图像时的高效性和灵活性而在开发社区中占据一席之地。图像处理涉及的领域包括但不限于图像的读取、处理、分析和视觉效果的生成等。

在Python的众多图像处理库中,Pillow库因其易用性和强大的功能而脱颖而出。Pillow库是Python Imaging Library (PIL)的一个分支,继承了PIL的所有功能,并且加入了许多改进和新特性。它支持包括打开、修改、保存在内的多种图像格式,并提供了丰富的图像处理功能,如像素操作、几何变换、图像增强和滤镜应用等。

Pillow的特点可以总结如下:

  1. 广泛的文件格式支持:Pillow支持多种图像格式,包括常见的JPEG、PNG、BMP、GIF等,方便开发者处理不同来源的图像。
  2. 丰富的图像处理功能:除了基本的图像处理操作外,Pillow还提供了色彩转换、滤镜效果、图像合成等高级功能。
  3. 易于学习和使用:对于熟悉Python的开发者来说,Pillow的API设计直观易懂,上手快,学习成本低。
  4. 高效的图像处理能力:Pillow的图像处理速度相对较快,能够满足大部分图像处理需求。

在本文中,我们将重点探讨如何利用Pillow进行有效的图像处理。无论是基础的图像操作,还是更复杂的图像处理任务,我们都将通过实例和详细说明,帮助读者深入理解并掌握Pillow的使用方法。

Pillow库基础

Pillow库是进行Python图像处理的基石。在深入学习之前,了解其基本概念和操作是至关重要的。本节将从导入Pillow库开始,逐步介绍其核心概念和基础操作。

导入Pillow库

要使用Pillow进行图像处理,首先需要确保已经安装了Pillow。安装完成后,可以通过简单的导入语句来使用它:

from PIL import Image

Image模块是Pillow中最为核心的部分,几乎所有的图像操作都需要用到它。

基本概念

在深入Pillow的功能之前,先了解一些基本概念对于后续学习非常有帮助。

  1. 图像对象:在Pillow中,图像是以对象的形式表示的。每个图像对象包含了图像的数据,以及可以对这些数据进行操作的方法。
  2. 像素访问:可以直接访问和修改图像的像素。Pillow提供了多种方式来读取和改变像素值。
  3. 颜色管理:Pillow支持广泛的颜色模式,包括RGB、RGBA、L(灰度图像)等,方便在不同模式间转换。

图像的打开、保存和显示

使用Pillow处理图像的基本流程包括打开图像、进行某些操作,然后保存或显示图像。

  1. 打开图像

    image = Image.open('example.jpg')
    

    这行代码会加载一个名为example.jpg的图像文件,并创建一个图像对象。

  2. 保存图像

    image.save('new_image.jpg')
    

    对图像进行修改后,可以使用save方法将其保存为新文件。

  3. 显示图像

    image.show()
    

    show方法会在默认的图像查看器中打开图像,便于查看修改的效果。

以上是Pillow的一些基础操作。理解了这些,你就已经准备好进入更加丰富和复杂的图像处理世界了。

图像操作基础

在掌握了Pillow的基础知识后,我们将深入探索一些常见的图像操作。这些操作包括图像的剪裁、旋转、缩放以及色彩转换和滤镜应用。这些基本技巧是图像处理的核心,对于开发中的各种应用场景都至关重要。

图像的剪裁

图像剪裁是将图像的一部分切出来形成新的图像。在Pillow中,可以使用crop方法来实现这一点。

# 假设要剪裁的区域为(left, top, right, bottom)
box = (100, 100, 400, 400)
cropped_image = image.crop(box)
cropped_image.show()

这段代码将从原始图像中剪裁出一个指定区域的矩形,并显示出来。

图像的旋转和缩放

旋转和缩放是图像处理中常用的技术,用于调整图像的方向和大小。

  1. 旋转

    rotated_image = image.rotate(45)  # 旋转45度
    rotated_image.show()
    
  2. 缩放

    resized_image = image.resize((200, 200))  # 将图像大小调整为200x200
    resized_image.show()
    

色彩转换和滤镜应用

Pillow还支持多种色彩模式的转换,以及丰富的滤镜效果。

  1. 色彩转换

    grayscale_image = image.convert('L')  # 转换为灰度图像
    grayscale_image.show()
    
  2. 滤镜效果

    from PIL import ImageFilter
    blurred_image = image.filter(ImageFilter.BLUR)  # 应用模糊滤镜
    blurred_image.show()
    

文字和图形的绘制

Pillow还提供了绘制文字和图形的功能,使得在图像上添加标注或设计成为可能。

from PIL import ImageDraw, ImageFontdraw = ImageDraw.Draw(image)
font = ImageFont.load_default()
draw.text((10, 10), "Hello, Pillow!", fill="black", font=font)
image.show()

通过这些基本操作,你已经可以开始对图像进行有效的处理和增强了。

高级图像处理

在掌握了Pillow的基础操作之后,我们将进入更为高级的图像处理领域。这一部分涉及图像的合成与蒙版操作、像素级操作以及复杂图形和图像的生成。这些高级技巧为开发者提供了更大的灵活性和创造力,使得可以创建出更加复杂和精细的图像效果。

图像的合成与蒙版操作

图像合成是将两张或多张图像融合在一起,创建出新的图像效果。而蒙版操作则是一种技术,它可以用来控制图像的哪一部分应该被合成。

  1. 图像合成

    image1 = Image.open('example1.jpg')
    image2 = Image.open('example2.jpg')
    image1.paste(image2, (50, 50))  # 将image2粘贴到image1上,起始坐标为(50, 50)
    image1.show()
    
  2. 蒙版操作

    mask = Image.new("L", image1.size, 128)  # 创建一个灰度蒙版
    image1.paste(image2, (50, 50), mask)  # 使用蒙版进行合成
    image1.show()
    

像素级操作与图像增强

像素级操作允许直接访问和修改图像的每个像素,从而实现精细的图像编辑和增强。

pixels = image.load()
for i in range(image.width):for j in range(image.height):r, g, b = pixels[i, j]pixels[i, j] = (r, g, b // 2)  # 减少蓝色通道的强度
image.show()

复杂图形和图像的生成

利用Pillow,我们还可以生成复杂的图形和图像。结合像素级操作和绘图功能,可以创造出独一无二的视觉效果。

for i in range(100, 300, 10):draw.line((i, 0, i, 400), fill="blue")  # 绘制蓝色的垂直线
image.show()

通过这些高级技巧,你可以进一步提升图像处理的深度和创造力,满足更复杂的项目需求。

Pillow与其他库的结合使用

Pillow作为一个强大的图像处理库,与其他Python库结合使用时能够发挥更大的潜力。特别是与NumPy和Matplotlib这两个库的结合,可以大大扩展Pillow在数据处理和可视化方面的能力。下面我们将探讨如何将Pillow与这些库结合起来,实现更为复杂的图像处理和分析任务。

结合NumPy进行图像数据操作

NumPy是一个广泛用于科学计算的Python库,它提供了高效的数组操作能力。将Pillow与NumPy结合,可以实现图像数据的快速操作和转换。

  1. 从Pillow到NumPy的转换

    import numpy as npimage = Image.open('example.jpg')
    image_array = np.array(image)  # 将Pillow图像转换为NumPy数组
    
  2. NumPy数组操作

    # 对图像进行一些NumPy操作
    image_array = image_array // 2  # 将所有像素值减半
    
  3. 从NumPy回到Pillow

    new_image = Image.fromarray(image_array)
    new_image.show()
    

与Matplotlib结合进行图像展示

Matplotlib是Python中一个广泛使用的绘图库,适用于创建高质量的图表和图像。通过将Pillow处理过的图像与Matplotlib结合,可以方便地进行图像的展示和进一步的图形绘制。

import matplotlib.pyplot as plt# 使用Pillow处理图像
image = Image.open('example.jpg')
image = image.rotate(45)# 使用Matplotlib展示图像
plt.imshow(image)
plt.axis('off')  # 不显示坐标轴
plt.show()

通过这种方式,Pillow的图像处理功能与NumPy的强大数据处理能力以及Matplotlib的绘图功能得到了完美的结合。这为Python图像处理提供了更广阔的应用领域和更强大的工具。

实战案例

在这一部分,我们将通过一个具体的实战案例,展示如何使用Pillow库来解决实际的图像处理问题。本案例将模拟一个常见的场景:给一组图像添加水印并调整大小,以准备用于网站展示。这个案例不仅将应用到前面提到的基础和高级图像操作,还将展示Pillow在实际开发中的应用。

案例描述

我们需要为一批图像添加统一的水印,并将它们的大小调整为统一的尺寸。这个任务在很多实际应用场景中都非常常见,比如在上传图片到网站之前添加品牌标志或版权信息。

实现步骤

  1. 加载水印图像
    我们首先需要一个水印图像。在这个例子中,水印图像是一个透明背景的PNG文件。

  2. 图像处理函数
    接下来,我们编写一个函数,该函数将水印添加到提供的图像上,并调整图像大小。

  3. 批量处理图像
    最后,我们将遍历一个包含多个图像的文件夹,并对每个图像应用我们的图像处理函数。

代码实现

以下是实现这一案例的Python代码:

from PIL import Imagedef add_watermark(input_image_path, output_image_path, watermark_image_path, position):# 加载原始图像和水印图像base_image = Image.open(input_image_path)watermark = Image.open(watermark_image_path)# 调整图像到所需大小base_image = base_image.resize((800, 600))# 添加水印base_image.paste(watermark, position, watermark)base_image.save(output_image_path)# 示例:为一个图像添加水印
add_watermark('example.jpg', 'watermarked_example.jpg', 'watermark.png', position=(0, 0))

在这个例子中,add_watermark函数接收原始图像路径、输出图像路径、水印图像路径和水印位置作为参数。它首先加载原始图像和水印图像,然后调整原始图像的大小,接着在指定位置添加水印,并保存处理过的图像。

通过这种方式,我们可以轻松地对一系列图像进行相同的处理,这在实际开发中非常有用。

总结与展望

经过对Pillow库的详细探讨,我们现在已经对如何使用Python进行高效的图像处理有了深入的理解。从基本的图像操作如打开、剪裁、旋转和调整大小,到更高级的技术如图像合成、像素级操作和与其他库的结合使用,Pillow为Python提供了一个强大且灵活的图像处理工具。

文章总结

  1. Pillow基础:我们介绍了如何在Python中使用Pillow库,以及进行基本的图像操作。
  2. 图像操作技术:详细探讨了图像的剪裁、旋转、缩放以及色彩转换等基础技巧。
  3. 高级图像处理:学习了更复杂的技术,如图像合成、像素级操作和复杂图形的生成。
  4. 结合其他库:展示了如何将Pillow与NumPy和Matplotlib等库结合使用,以实现更加复杂的图像处理任务。
  5. 实战案例:通过一个具体的案例,展示了Pillow在实际应用中的强大能力。

未来展望

随着技术的不断进步,Python的图像处理能力也在不断提升。我们可以预见到,未来的图像处理将更加依赖于人工智能和机器学习技术,以实现更加智能和自动化的图像分析和处理。同时,随着硬件性能的提升和云计算技术的普及,处理大规模图像数据将变得更加高效。

对于开发者而言,持续学习和掌握最新的图像处理技术,将是跟上这一领域快速发展步伐的关键。Pillow库作为一个强大的工具,无疑将继续在这个领域扮演重要角色。

附录:常见问题与解答

在使用Pillow进行图像处理的过程中,开发者可能会遇到各种问题。这个部分汇集了一些常见的问题,并提供了解决方案和建议,旨在帮助读者更顺利地使用Pillow库。

Q1: Pillow安装失败怎么办?

A: 安装Pillow时可能会因为环境配置或依赖问题导致失败。确保你的Python环境是最新的,并且使用了合适的包管理器(如pip)。有时候,安装预编译的wheel文件而不是从源代码编译可以解决问题。

Q2: 如何处理不同格式的图像?

A: Pillow支持多种图像格式。使用Image.open()函数打开图像时,Pillow会自动处理不同的格式。如果遇到不支持的格式,考虑将图像转换为Pillow支持的格式,如JPEG或PNG。

Q3: 在处理大量图像时,程序运行缓慢怎么办?

A: 优化图像处理逻辑,例如,通过减少不必要的图像质量转换来减少内存使用。另外,可以考虑使用多线程或多进程来并行处理图像,以提高效率。

Q4: 如何确保图像处理的效率和质量?

A: 选择合适的图像大小和格式是关键。大图像会消耗更多资源,因此在保证质量的前提下选择适当的尺寸。同时,适当使用Pillow的高级功能,如滤镜和图像增强,可以提高处理质量。

Q5: Pillow是否支持动态图像处理,如GIF?

A: 是的,Pillow支持处理GIF等动态图像格式。可以读取GIF的每一帧,对其进行处理,然后重新组合成动态图像。

Q6: 如何处理图像的色彩问题?

A: 色彩问题通常与图像的色彩模式有关。使用Pillow的convert方法可以在不同的色彩模式之间转换,如从RGB转换为灰度模式。对于更复杂的色彩调整,可以使用Pillow提供的色彩增强功能。

相关文章:

掌握Pillow:Python图像处理的艺术

掌握Pillow:Python图像处理的艺术 引言Python与图像处理的概述Pillow库基础导入Pillow库基本概念图像的打开、保存和显示 图像操作基础图像的剪裁图像的旋转和缩放色彩转换和滤镜应用文字和图形的绘制 高级图像处理图像的合成与蒙版操作像素级操作与图像增强复杂图形…...

React最常用的几个hook

React最常用的几个Hook包括:useState、useEffect、useRef以及useContext。 useState: 用于在函数组件中添加状态管理。它返回一个数组,第一个元素是当前状态的值,第二个元素是更新状态的函数。在使用时,可以通过解构赋…...

自然语言处理Gensim入门:建模与模型保存

文章目录 自然语言处理Gensim入门:建模与模型保存关于gensim基础知识1. 模块导入2. 内部变量定义3. 主函数入口 (if __name__ __main__:)4. 加载语料库映射5. 加载和预处理语料库6. 根据方法参数选择模型训练方式7. 保存模型和变换后的语料8.代码 自然语言处理Gens…...

Windows 10中Visual Studio Code(VSCode)无法自动打开终端的解决办法

1.检查设置: 打开VSCode。点击左侧菜单栏的“文件”(File)。选择“首选项”(Preferences)。点击“设置”(Settings)。在搜索框中输入“shell”,然后点击“settings.json”进行编辑。…...

python dictionary 字典中的内置函数介绍及其示例

Python字典内置方法: 本文介绍了Python字典(dictionary)中的内置函数及其用法示例。字典是Python中非常常用的一种数据结构,它允许我们通过键(key)来快速查找、添加、修改或删除值(value&#…...

pdf转word文档怎么转?分享4种转换方法

pdf转word文档怎么转?在日常工作中,我们经常遇到需要将PDF文件转换为Word文档的情况。无论是为了编辑、修改还是为了重新排版,将PDF转为Word都显得尤为重要。那么,PDF转Word文档怎么转呢?今天,就为大家分享…...

深度测试:指定DoC ID对ES写入性能的影响

在[[使用python批量写入ES索引数据]]中已经介绍了如何批量写入ES数据。基于该流程实际测试一下指定文档ID对ES性能的影响有多大。 一句话版 指定ID比不指定ID的性能下降了63%,且加剧趋势。 以下是测评验证的细节。 百万数据量 索引默认使用1分片和1副本。 指定…...

【JGit】 AddCommand 新增的文件不能添加到暂存区

执行git.add().addFilepattern(".").setUpdate(true).call() 。新增的文件不能添加到暂存区,为什么? 在 JGit 中,setUpdate(true) 方法用于在调用 AddCommand 的 addFilepattern() 方法时,将已跟踪文件标记为需要更新。…...

golang学习6,glang的web的restful接口传参

1.get传参 //get请求 返回json 接口传参r.GET("/getJson/:id", controller.GetUserInfo) 1.2.接收处理 package controllerimport "github.com/gin-gonic/gin"func GetUserInfo(c *gin.Context) {_ c.Param("id")ReturnSucess(c, 200, &quo…...

Carla自动驾驶仿真八:两种查找CARLA地图坐标点的方法

文章目录 前言一、通过Spectator获取坐标二、通过道路ID获取坐标总结 前言 CARLA没有直接的方法给使用者查找地图坐标点来生成车辆,这里推荐两种实用的方法在特定的地方生成车辆。 一、通过Spectator获取坐标 1、Spectator(观察者)&#xf…...

HarmonyOS | 状态管理(八) | PersistentStorage(持久化存储UI状态)

系列文章目录 1.HarmonyOS | 状态管理(一) | State装饰器 2.HarmonyOS | 状态管理(二) | Prop装饰器 3.HarmonyOS | 状态管理(三) | Link装饰器 4.HarmonyOS | 状态管理(四) | Provide和Consume装饰器 5.HarmonyOS | 状态管理(五) | Observed装饰器和ObjectLink装饰器 6.Harmo…...

Git 突破 文件尺寸限制

前言 当Git本地存储里右超过50MB,却又确实需要上传的时候,就需要用到了不是 解决 本代码就是把大文件进行拆解成小文件,然后上传。 等到拉取下来的时候,可以直接再进行合并,合并成原文件 代码如下,仅供…...

HarmonyOS开发云工程与开发云函数

创建函数 您可直接在DevEco Studio创建函数、编写函数业务代码、为函数配置调用触发器。 1.右击“cloudfunctions”目录,选择“New > Cloud Function”。 2.输入函数名称后,点击“OK”。 函数名称仅支持小写英文字母、数字、中划线(-&a…...

SpringMVC了解

1.springMVC概述 Spring MVC(Model-View-Controller)是基于 Java 的 Web 应用程序框架,用于开发 Web 应用程序。它通过将应用程序分为模型(Model)、视图(View)和控制器(Controller&a…...

day44((VueJS)路由的懒加载使用 路由的元信息(meta) 路由守卫函数 vant组件库的应用)

一.路由懒加载的使用 使用原因 1.使用原因1) 使用一般写法(即直接填写组件的缺点)当使用这种写法,页面在初次加载会将所有路由配置表的添加的组件一次性全部加载,如果项目中组件代码量庞大,就需要很长时间…...

非线性优化资料整理

做课题看了一些非线性优化的资料,整理一下,以方便查看: 优化的中文博客 数值优化|笔记整理(8)——带约束优化:引入,梯度投影法 (附代码)QP求解器对比对于MPC的QP求解器 数值优化| 二次规划的…...

踩坑wow.js 和animate.css一起使用没有效果

踩坑wow.js 和animate.css一起使用没有效果 问题及解决方法一、电脑系统配置问题二、版本问题 问题及解决方法 一、电脑系统配置问题 在系统属性里面把窗口内的动画和元素勾选 二、版本问题 使用wow加animate4.4.1也就是最新本,打开网页没有任何动画效果 但是把…...

Laravel - API 项目适用的图片验证码

1. 安装 gregwar/captcha 图片验证码接口的流程是: 生成图片验证码 生成随机的 key,将验证码文本存入缓存。 返回随机的 key,以及验证码图片 # 不限于 laravel 普通 php 项目也可以使用额 $ composer require gregwar/captcha2. 开发接口 …...

iMazing3安全吗?好不好用?值不值得下载

一、安全性 iMazing在设计和开发过程中,始终把用户数据的安全性放在首位。它采用了多种先进的安全技术来确保用户数据在传输、备份和存储过程中的安全。 iMazing3Mac-最新绿色安装包下载如下: https://wm.makeding.com/iclk/?zoneid49816 iMazing3Wi…...

韩国突发:将批准比特币ETF

作者:秦晋 韩国两党宣布将批准比特币ETF。比特币也再次成为竞选的宠儿。 4月10日,韩国将迎来每隔4年而进行的一次立法大选。在大选之前,现执政党与反对党都承诺将批准比特币ETF。 我们知道,比特币的主要受众群体以年轻人居多。此前…...

mongodb源码分析session执行handleRequest命令find过程

mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程,并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令,把数据流转换成Message,状态转变流程是:State::Created 》 St…...

MySQL账号权限管理指南:安全创建账户与精细授权技巧

在MySQL数据库管理中,合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号? 最小权限原则&#xf…...

HashMap中的put方法执行流程(流程图)

1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中,其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下: 初始判断与哈希计算: 首先,putVal 方法会检查当前的 table(也就…...

Spring是如何解决Bean的循环依赖:三级缓存机制

1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间‌互相持有对方引用‌,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...

C++.OpenGL (14/64)多光源(Multiple Lights)

多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...

嵌入式学习笔记DAY33(网络编程——TCP)

一、网络架构 C/S (client/server 客户端/服务器):由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序,负责提供用户界面和交互逻辑 ,接收用户输入,向服务器发送请求,并展示服务…...

20个超级好用的 CSS 动画库

分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码,而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库,可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画,可以包含在你的网页或应用项目中。 3.An…...

【JavaSE】多线程基础学习笔记

多线程基础 -线程相关概念 程序(Program) 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序,比如我们使用QQ,就启动了一个进程,操作系统就会为该进程分配内存…...

Unity中的transform.up

2025年6月8日,周日下午 在Unity中,transform.up是Transform组件的一个属性,表示游戏对象在世界空间中的“上”方向(Y轴正方向),且会随对象旋转动态变化。以下是关键点解析: 基本定义 transfor…...

若依登录用户名和密码加密

/*** 获取公钥:前端用来密码加密* return*/GetMapping("/getPublicKey")public RSAUtil.RSAKeyPair getPublicKey() {return RSAUtil.rsaKeyPair();}新建RSAUti.Java package com.ruoyi.common.utils;import org.apache.commons.codec.binary.Base64; im…...