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

python进阶之图像编程 pillow扩展库

一、概述

1.1pillow简介

Python Imaging Library (PIL)是python 下的图像处理模块,支持多种格式,并提供强大的图像处理功能,可以通过pip进行安装后使用。

1.2pillow具体应用

Pillow 库是 Python3 最常用的图像处理库,它支持多种图像格式,可以用于图像处理、图像增强、图像合成等。下面是 Pillow 库中的一些常用函数:open():打开一张图片;new():创建一张新的图片;save():保存一张图片;show():显示一张图片;resize():改变图片的大小;crop():裁剪图片;rotate():旋转图片;transpose():翻转图片;convert():转换图片的格式或色彩模式;filter():使用滤镜处理图片;getpixel():获取图片中指定位置的像素值;putpixel():设置图片中指定位置的像素值;paste():将一张图片粘贴到另一张图片上。

1.3快速入门

通过文件创建 Image 对象

通过文件创建 Image 图像对象是最常用的方法

示例:通过文件创建 Image 图像对象

from PIL import Imageimage = Image.open("D://桌面//1.jpeg")  # 创建图像实例
# 查看图像实例的属性
print(image.format, image.size, image.mode)image.show() # 显示图像

 格式转换并保存图像

pillow Image 模块中的 save 函数可以保存图片,除非你指定文件格式,否则文件的扩展名就是文件格式。

from PIL import Image
import os# 打开图片
image_path = "D://桌面//1.png"
image = Image.open(image_path)# 获取文件名与后缀
f, e = os.path.splitext(image_path)# 指定输出文件格式
output_format = "jpeg"  # 要保存的文件格式,比如 "PNG"、"JPEG" 等# 创建输出文件名
outfile = f + "." + output_format.lower()# 保存图片并指定文件格式
image.save(outfile, format=output_format)print(f"图片已保存为 {outfile},格式为 {output_format}")
image.show()

save() 函数有两个参数,如果文件名没有指定图片格式,那么第二个参数是必须的,他指定图片的格式。

二、课堂实操

2.1 创建缩略图

创建缩略图 使用 Image.thumbnail( size ), size 为缩略图宽长元组。

示例: 创建缩略图

from PIL import Image
import os# 打开图片
image_path = "D://桌面//1.png"
image = Image.open(image_path)# 获取文件名与后缀
f, e = os.path.splitext(image_path)# 指定输出文件格式
output_format = "PNG"  # 要保存的文件格式,比如 "PNG"、"JPEG" 等# 创建输出文件名
outfile = f + "_thumbnail." + output_format.lower()# 创建缩略图
thumbnail_size = (100, 100)  # 缩略图尺寸
image.thumbnail(thumbnail_size)# 保存缩略图并指定文件格式
image.save(outfile, format=output_format)print(f"缩略图已保存为 {outfile},格式为 {output_format}")

2.2剪贴,粘贴、合并图像

2.2.1Image类包含允许您操作图像中的区域的方法。如:要从图像中复制子矩形图像使用 crop() 方法。

2.2.2注意:将子图(region) 粘贴(paste)回原图时,粘贴位置 box 的像素与宽高必须吻合。而原图和子图的 mode 不需要匹配,Pillow会自动处理。

粘贴其它图片

from PIL import Image
import os# 打开图片
image_path = "D://桌面//1.jpeg"
image = Image.open(image_path)# 获取文件名与后缀
f, e = os.path.splitext(image_path)# 剪切区域
crop_box = (100, 100, 300, 300)  # 左上角坐标为 (100, 100),右下角坐标为 (300, 300)
cropped_image = image.crop(crop_box)# 打开另一张图片作为粘贴对象
paste_image_path = "D://桌面//2.jpeg"
paste_image = Image.open(paste_image_path)# 调整粘贴对象的尺寸和模式以匹配剪切区域
paste_image = paste_image.resize((crop_box[2] - crop_box[0], crop_box[3] - crop_box[1]))# 在原图上粘贴剪切区域
image.paste(paste_image, crop_box)# 保存合并后的图像
merged_outfile = f + "_merged." + e
image.save(merged_outfile)print(f"合并后的图像已保存为 {merged_outfile}")

当你从一个图像中剪切出一个区域,然后希望将这个剪切出的区域粘贴到另一个图像上时,剪切出的区域和粘贴目标的尺寸和模式(也就是图像的大小和颜色通道等信息)需要匹配,以确保粘贴操作能够成功。

在你的代码中,你已经定义了一个剪切区域 crop_box,这个区域的左上角坐标为 (100, 100),右下角坐标为 (300, 300)。剪切区域的宽度是 300 - 100 = 200,高度是 300 - 100 = 200。

粘贴自身图片

from PIL import Image
import os# 打开图片
image_path = "D://桌面//1.jpeg"
image = Image.open(image_path)# 获取文件名与后缀
f, e = os.path.splitext(image_path)# 剪切区域
crop_box = (100, 100, 300, 300)  # 左上角坐标为 (100, 100),右下角坐标为 (300, 300)
cropped_image = image.crop(crop_box)# 在原图上粘贴剪切区域
image.paste(cropped_image, crop_box)# 对粘贴的图像进行颠倒180度
region = image.crop(crop_box)
region = region.transpose(Image.ROTATE_180)# 将颠倒后的图像再次粘贴回原图上
image.paste(region, crop_box)# 保存合并后的图像
merged_outfile = f + "_merged1." + e
image.save(merged_outfile)print(f"合并后的图像已保存为 {merged_outfile}")

2.3几何变换

当使用Pillow(PIL)库的Image模块进行几何变换时,你可以使用rotate()方法或transpose()方法来实现不同类型的旋转和翻转。

使用rotate()方法进行图像旋转:

from PIL import Image# 打开图片
image_path = "D://桌面//1.jpeg"
image = Image.open(image_path)# 获取文件名与后缀
f, e = os.path.splitext(image_path)# 定义旋转角度(以度为单位,逆时针方向为正)
angle = 45# 旋转图像
rotated_image = image.rotate(angle)# 保存旋转后的图像
rotated_outfile = f + "_rotated." + e
rotated_image.save(rotated_outfile)print(f"旋转后的图像已保存为 {rotated_outfile}")

使用transpose()方法进行图像翻转:

from PIL import Image# 打开图片
image_path = "D://桌面//1.jpeg"
image = Image.open(image_path)# 获取文件名与后缀
f, e = os.path.splitext(image_path)# 对图像进行水平翻转
flipped_image_horizontal = image.transpose(Image.FLIP_LEFT_RIGHT)# 对图像进行垂直翻转
flipped_image_vertical = image.transpose(Image.FLIP_TOP_BOTTOM)# 保存翻转后的图像
flipped_horizontal_outfile = f + "_flipped_horizontal." + e
flipped_image_horizontal.save(flipped_horizontal_outfile)flipped_vertical_outfile = f + "_flipped_vertical." + e
flipped_image_vertical.save(flipped_vertical_outfile)print(f"水平翻转后的图像已保存为 {flipped_horizontal_outfile}")
print(f"垂直翻转后的图像已保存为 {flipped_vertical_outfile}")
out = im.transpose(Image.FLIP_LEFT_RIGHT) # 水平左右翻转
out = im.transpose(Image.FLIP_TOP_BOTTOM) # 垂直上下翻转
out = im.transpose(Image.ROTATE_90) # 逆时针90度
out = im.transpose(Image.ROTATE_180) # 逆时针180度
out = im.transpose(Image.ROTATE_270) # 逆时针270度

 2.4颜色变换

from PIL import Image
import numpy as np# 打开图片
image_path = "D://桌面//1.jpeg"
image = Image.open(image_path)# 获取文件名与后缀
f, e = os.path.splitext(image_path)# 改变图像亮度
brightness_factor = 1.5
brightened_image = Image.eval(image, lambda x: min(255, x * brightness_factor))# 修改图像通道颜色
r, g, b = image.split()
new_image = Image.merge("RGB", (b, r, g))# 保存修改后的图像
brightened_outfile = f + "_brightened." + e
new_image.save(brightened_outfile)print(f"修改后的图像已保存为 {brightened_outfile}")

Image.eval() 方法允许我们在像素级别对图像进行操作。在这个示例中,我们使用了一个lambda函数,将每个像素的值乘以亮度因子来改变图像的亮度。

使用 split() 和 merge() 方法来重新排列图像的颜色通道。在这个示例中,我们将原始图像的红色和蓝色通道进行交换,以改变颜色分布。

灰度图像

from PIL import Image# 打开图片
image_path = "D://桌面//1.jpeg"
image = Image.open(image_path)# 获取文件名与后缀
f, e = os.path.splitext(image_path)# 将彩色图像转换为灰度图像
gray_image = image.convert("L")# 保存灰度图像
gray_outfile = f + "_gray." + e
gray_image.save(gray_outfile)print(f"灰度图像已保存为 {gray_outfile}")

Pillow(PIL)库支持多种图像模式,每种模式具有不同的颜色通道和像素表示方式。以下是一些常见的图像模式:

  1. RGB("RGB"):每个像素由红色、绿色和蓝色通道组成,是彩色图像的常见模式。
  2. 灰度("L"):每个像素只有一个通道,表示像素的亮度值,用于灰度图像。
  3. RGBA("RGBA"):类似于RGB,还包括一个透明度通道,用于带有透明背景的彩色图像。
  4. CMYK("CMYK"):一种印刷颜色模式,使用青色、洋红色、黄色和黑色通道表示颜色。
  5. HSV("HSV"):使用色相、饱和度和值通道来表示颜色。
  6. 二值化("1"):每个像素只有一个二进制值,用于表示黑白图像。


可以根据需要使用convert()方法将图像从一种模式转换为另一种模式

2.5图像增强 

from PIL import Image, ImageEnhance# 打开图片
image_path = "D://桌面//1.jpeg"
image = Image.open(image_path)# 获取文件名与后缀
f, e = os.path.splitext(image_path)# 增强图像亮度
enhancer = ImageEnhance.Brightness(image)
brightened_image = enhancer.enhance(1.5)  # 1.5表示增强的倍数# 增强图像对比度
enhancer = ImageEnhance.Contrast(image)
high_contrast_image = enhancer.enhance(1.5)  # 1.5表示增强的倍数# 增强图像色彩
enhancer = ImageEnhance.Color(image)
colorful_image = enhancer.enhance(1.5)  # 1.5表示增强的倍数# 增强图像锐度
enhancer = ImageEnhance.Sharpness(image)
sharp_image = enhancer.enhance(2.0)  # 2.0表示增强的倍数# 保存增强后的图像
brightened_outfile = f + "_brightened." + e
high_contrast_outfile = f + "_high_contrast." + e
colorful_outfile = f + "_colorful." + e
sharp_outfile = f + "_sharp." + ebrightened_image.save(brightened_outfile)
high_contrast_image.save(high_contrast_outfile)
colorful_image.save(colorful_outfile)
sharp_image.save(sharp_outfile)print(f"亮度增强后的图像已保存为 {brightened_outfile}")
print(f"对比度增强后的图像已保存为 {high_contrast_outfile}")
print(f"色彩增强后的图像已保存为 {colorful_outfile}")
print(f"锐度增强后的图像已保存为 {sharp_outfile}")

其他图像增强功能可以使用 ImageEnhance 模块中的类。从图像创建后,可以使用 ImageEnhance 快速调整图片的对比度、亮度、饱和度和清晰度。

ImageEnhance 方法类型:

ImageEnhance.Contrast(im) 对比度
ImageEnhance.Color(im) 色彩饱和度
ImageEnhance.Brightness(im) 亮度
ImageEnhance.Sharpness(im) 清晰度

 处理单独通道

处理图像的单独通道意味着你可以选择性地对图像的红色、绿色、蓝色或灰度通道进行操作。Pillow(PIL)库允许你通过拆分图像的通道,对每个通道进行处理,然后重新合并通道来生成处理后的图像。

from PIL import Image# 打开图片
image_path = "D://桌面//1.jpeg"
image = Image.open(image_path)# 获取文件名与后缀
f, e = os.path.splitext(image_path)# 拆分图像的通道
r, g, b = image.split()# 处理单独的通道
r = r.point(lambda p: p * 0.8)  # 处理红色通道,降低亮度
g = g.point(lambda p: p * 1.2)  # 处理绿色通道,增加亮度
b = b.point(lambda p: p * 0.9)  # 处理蓝色通道,降低亮度# 合并通道
processed_image = Image.merge("RGB", (r, g, b))# 保存处理后的图像
processed_outfile = f + "_processed." + e
processed_image.save(processed_outfile)print(f"处理后的图像已保存为 {processed_outfile}")

处理灰度通道

from PIL import Image# 打开图片
image_path = "D://桌面//1.jpeg"
image = Image.open(image_path)# 获取文件名与后缀
f, e = os.path.splitext(image_path)# 将图像转换为灰度模式
gray_image = image.convert("L")# 处理灰度图像的单独通道
processed_gray_image = gray_image.point(lambda p: p * 0.8)  # 降低亮度# 保存处理后的灰度图像
processed_gray_outfile = f + "_processed_gray." + e
processed_gray_image.save(processed_gray_outfile)print(f"处理后的灰度图像已保存为 {processed_gray_outfile}")

2.6动态图像

Pillow 支持一些动态图像处理(如FLI/FLC,GIF等格式)。TIFF文件同样可以包含数帧图像。

打开动态图像时,PIL 会自动加载序列中的第一帧。你可以使用 seek 和 tell 方法在不同的帧之间移动。

2.7水印

Pillow(PIL)库允许你在图像上添加图像、文字或水印。

图像水印

from PIL import Image# 打开主图像和水印图像
main_image_path = "D://桌面//1.jpeg"
watermark_image_path = "D://桌面//2.jpeg"main_image = Image.open(main_image_path)
watermark_image = Image.open(watermark_image_path)# 将水印图像缩放到合适的大小
watermark_size = (100, 100)  # 替换为合适的尺寸
watermark_image = watermark_image.resize(watermark_size, Image.ANTIALIAS)# 创建一个透明度通道
alpha_channel = Image.new("L", watermark_image.size, 128)  # 128表示透明度(0为完全透明,255为不透明)# 将透明度通道与水印图像合并
watermark_image.putalpha(alpha_channel)# 计算水印位置(右下角)
main_width, main_height = main_image.size
watermark_width, watermark_height = watermark_image.size
x = main_width - watermark_width
y = main_height - watermark_height# 在主图像上添加透明水印
main_image.paste(watermark_image, (x, y), watermark_image)# 保存带有透明水印的图像
watermarked_outfile = f + "_watermarked." + e
main_image.save(watermarked_outfile)print(f"带有透明水印的图像已保存为 {watermarked_outfile}")

文本水印

from PIL import Image, ImageDraw, ImageFont# 打开图片
main_image_path = "D://桌面//1.jpeg"
main_image = Image.open(main_image_path)# 获取文件名与后缀
f, e = os.path.splitext(main_image_path)# 创建一个ImageDraw对象
draw = ImageDraw.Draw(main_image)# 定义水印文本和字体
watermark_text = "Watermark"
font = ImageFont.truetype("arial.ttf", 36)  # 替换为合适的字体路径和大小# 计算水印文本的尺寸
text_width, text_height = draw.textsize(watermark_text, font)# 创建一个透明度通道
alpha_channel = Image.new("L", (text_width, text_height), 128)  # 128表示透明度(0为完全透明,255为不透明)# 创建一个带有透明度的文本图像
watermark_text_image = Image.new("RGBA", (text_width, text_height))
watermark_draw = ImageDraw.Draw(watermark_text_image)
watermark_draw.text((0, 0), watermark_text, fill=(255, 255, 255, 128), font=font)  # 填充颜色和透明度# 计算水印位置(居中)
main_width, main_height = main_image.size
x = (main_width - text_width) // 2
y = (main_height - text_height) // 2# 在主图像上添加文本透明水印
main_image.paste(watermark_text_image, (x, y), watermark_text_image)# 保存带有文本透明水印的图像
watermarked_outfile = f + "_watermarked." + e
main_image.save(watermarked_outfile)print(f"带有文本透明水印的图像已保存为 {watermarked_outfile}")

2.8生成验证码图片

import random
from PIL import Image, ImageDraw, ImageFont# 创建验证码图像
width, height = 200, 100
background_color = (255, 255, 255)  # 白色背景
image = Image.new("RGB", (width, height), background_color)# 创建一个ImageDraw对象
draw = ImageDraw.Draw(image)# 创建一个字体对象
font = ImageFont.truetype("arial.ttf", 48)  # 替换为合适的字体路径和大小# 随机生成4个字符作为验证码
characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
code = "".join(random.choice(characters) for _ in range(4))# 计算每个字符的位置(居中)
text_width, text_height = draw.textsize(code, font)
x = (width - text_width) // 2
y = (height - text_height) // 2# 在图像上绘制验证码
draw.text((x, y), code, fill=(0, 0, 0), font=font)  # 使用黑色填充# 添加干扰线
for _ in range(5):x1 = random.randint(0, width)y1 = random.randint(0, height)x2 = random.randint(0, width)y2 = random.randint(0, height)draw.line((x1, y1, x2, y2), fill=(0, 0, 0), width=2)# 保存验证码图片
captcha_outfile = "captcha.png"
image.save(captcha_outfile)print(f"验证码图片已保存为 {captcha_outfile},验证码为: {code}")

相关文章:

python进阶之图像编程 pillow扩展库

一、概述 1.1pillow简介 Python Imaging Library (PIL)是python 下的图像处理模块,支持多种格式,并提供强大的图像处理功能,可以通过pip进行安装后使用。 1.2pillow具体应用 Pillow 库是 Python3 最常用的图像处理库,它支持多种图像格式&a…...

TiCDC Canal-JSON 消息接收示例(Java 版)

1.引言 业务程序经常会通过各式各样的缓存来提升用户的访问速度。 由于存在缓存,在一些实时性要求较高的场景中,需要在数据变更的同时将数据缓存进行更新或删除。 如果数据本身由其他业务部门提供,就无法在写入的同时做缓存的一致性处理。…...

SQLite、MySQL、PostgreSQL3个关系数据库之间的对比

引言 关系数据模型以行和列的表格形式组织数据,在数据库管理工具中占主导地位。今天还有其他数据模型,包括NoSQL和NewSQL,但是关系数据库管理系统(RDBMS)仍然占主导地位用于存储和管理全球数据。 本文比较了三种实现最…...

开源容灾备份软件,开源cdp备份软件

数据的安全性和完整性面临着硬件问题、黑客攻击、人为错误等各种威胁。在这种环境下,开源容灾备份软件应运而生,通过提供自动数据备份和恢复,有效地保证了公司的数据安全。 一、开源容灾备份软件的定义和作用 开源容灾备份软件是一种基于开源…...

Java合并区间

问题: 以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。 示例: 示例 1&#xff…...

前端面试:【代码质量与工程实践】单元测试、集成测试和持续集成

在现代软件开发中,确保代码质量是至关重要的。单元测试、集成测试和持续集成是关键的工程实践,用于提高代码的可靠性和可维护性。本文将深入探讨这些概念,以及它们如何在软件开发中发挥作用。 1. 单元测试(Unit Testing&#xff0…...

2023/8/17总结

项目完善: 算法推荐 item-CF 算法推荐我主要写的是协同过滤算法,然后协同过滤算法分成俩种—— 基于用户的 user-CF 基于物品的 item-CF 因为害怕用户冷启动,和数据量的原因 我选择了 item-CF 主要思路是——根据用户的点赞列表&…...

REDIS 7 教程 数据类型-进阶篇

⑥ *位图 bitmap 1. 理论 由0和1 状态表现的二进制位的bit 数组。 说明:用String 类型作为底层数据结构实现的一种统计二值状态的数据类型 位图本质是数组,它是基于String 数据类型的按位操作。该数组由多个二进制位组成,每个二进制位都对应一个偏…...

图文并茂:Python Tkinter从入门到高级实战全解析

目录 介绍什么是Tkinter?准备工作第一个Tkinter程序界面布局事件处理补充知识点 文本输入框复选框和单选框列表框弹出对话框 综合案例:待办事项列表总结 介绍 欢迎来到本篇文章,我们将带您深入了解如何在Python中使用Tkinter库来创建图形用…...

npm和yarn的区别?

文章目录 前言npm和yarn的作用和特点npm和yarn的安装的机制npm安装机制yarn安装机制检测包解析包获取包链接包构建包 总结后言 前言 这一期给大家讲解npm和yarn的一些区别 npm和yarn的作用和特点 包管理:npm 和 yarn 可以用于安装、更新和删除 JavaScript 包。它们提…...

微服务项目容器编排docker-compose.yml、Dockerfile文件模板、相关配置文件、shell脚本

nacos Dockerfile&#xff08;不需要特殊处理&#xff0c;使用docker conpose可以不写&#xff09; # 基础镜像 FROM nacos/nacos-server # author MAINTAINER jianglifeng<jlifengfoxmail.com> RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \ &&a…...

算法通过村第三关-数组黄金笔记|数组难解

文章目录 前言数组中出现超过一半的数字数组中只出现一次的数字颜色的分类问题(荷兰国旗问题)基于冒泡排序的双指针&#xff08;快慢指针&#xff09;基于快排的双指针&#xff08;对撞指针&#xff09; 总结 前言 提示&#xff1a;苦不来自外在环境中的人、事、物&#xff0c;…...

【2023】LeetCode HOT 100——矩阵

目录 1. 矩阵置零1.1 C++实现1.2 Python实现1.3 时空分析2. 螺旋矩阵2.1 C++实现2.2 Python实现2.3 时空分析3. 旋转图像3.1 C++实现3.2 Python实现3.3 时空分析4. 搜索二维矩阵 II4.1 C++实现4.2 Python实现4.3 时空分析1. 矩阵置零 🔗 原题链接:...

springboot源码方法

利用LinkedHashSet移除List重复的数据protected final <T> List<T> removeDuplicates(List<T> list) {return new ArrayList<>(new LinkedHashSet<>(list));} SpringFactoriesLoader#loadFactoryNames 加载配置文件...

基于java街球社区网站设计与实现

摘  要 本文主要讲述了基于SpringBootVue模式的街球社区网站的设计与实现。这里所谓的街球社区网站是通过类似于百度贴吧之类的网上论坛使得所有的街球爱好者有一个可以互相交流的平台,并使所有用户可以在社区进行教学视频的观看以及相关体育运动产品的选购,平台的盈利主要靠…...

定时产生不同频率方波

/*----------------------------------------------- 内容&#xff1a;通过定时产生不同频率方波 ------------------------------------------------*/ #include<reg52.h> //包含头文件&#xff0c;一般情况不需要改动&#xff0c;头文件包含特殊功能寄存器的定义 /*-…...

Java“牵手”天猫商品sku信息API接口数据,天猫API接口申请指南

天猫平台商品sku属性信息接口是开放平台提供的一种API接口&#xff0c;通过调用API接口&#xff0c;开发者可以获取天猫商品的标题、价格、库存、月销量、总销量、库存、详情描述、图片等详细信息 。 获取商品销量接口API是一种用于获取电商平台上商品sku属性数据的接口&#…...

【⑮MySQL | 视图】概述 | 创建 | 查看 | 更新 | 修改 | 删除

前言 ✨欢迎来到小K的MySQL专栏&#xff0c;本节将为大家带来MySQL视图概述 | 创建 | 查看 | 更新 | 修改 | 删除的分享✨ 目录 前言1.视图概述2.创建视图3.查看视图4.更新视图数据5.修改视图6.删除视图总结 1.视图概述 1.1 为什么使用视图&#xff1f; 视图一方面可以帮我们使…...

Linux驱动开发一、RK3568把hello编译到Linux内核中运行。‘rk_vendor_read’未定义的引用

1、在字符设备目录下建立hello目录 ~/Linux/rk356x_linux/kernel/drivers/char/hello 2、进入hello目录&#xff0c;新建hello.c、Makefile、Kconfig三个文件 3、Kconfig是打开make menuconfig配置界面是后的选项&#xff0c;这Kconfig是在字符设备下的。 config HELLOtrist…...

enable_shared_from_this

用途&#xff1a; enable_shared_from_this 是一个基类模板&#xff0c;用于解决在类成员函数中获取类对象的 shared_ptr 的需求。它提供了一种机制&#xff0c;使类能够安全地从成员函数内部获得指向自身的 shared_ptr。 解决对象生命周期管理问题&#xff1a;在某些情况下&…...

weak_ptr是怎么探知对象生死的

weak_ptr是C智能指针中的一种。它用于解决共享所有权的问题&#xff0c;并且可以避免因循环引用而导致的内存泄漏。 weak_ptr本身并不承担对象的所有权&#xff0c;它指向由shared_ptr管理的对象。与shared_ptr不同&#xff0c;weak_ptr并不会增加计数器来计算对象的引用次数。…...

⌈算法进阶⌋图论::拓扑排序(Topological Sorting)——快速理解到熟练运用

目录 一、原理 1. 引例&#xff1a;207.课程表 2. 应用场景 3. 代码思路 二、代码模板 三、练习 1、210.课程表Ⅱ&#x1f7e2; 2、2392.给定条件下构造举证&#x1f7e1; 3、310.最小高度树 &#x1f7e1; 一、原理 1. 引例&#xff1a;207.课程表 就如大学课程安排一样&…...

【Python】【数据结构和算法】保留最后N个元素

使用deque&#xff0c;指定maxlen参数的值为N&#xff0c;例如&#xff1a; >>> from collections import deque >>> dq deque(maxlen3) >>> dq.append(1) >>> dq.append(2) >>> dq.append(3) >>> dq.append(4) >&…...

wireshark 基本使用

在Wireshark中&#xff0c;你可以使用过滤器来根据接口名称定位到特定的包。下面是一些常见的过滤器示例&#xff1a; 根据源或目的IP地址过滤&#xff1a; ip.src 192.168.0.1&#xff1a;过滤源IP地址为192.168.0.1的包。ip.dst 192.168.0.1&#xff1a;过滤目的IP地址为…...

2、结构型设计模式

结构型设计模式 目录 结构型设计模式1. 代理模式1.1 概述1.2 结构1.3 静态代理1)抽象主题类 SellTickets2)真实主题类 TrainStation3)代理类 ProxyPoint4)客户端类1.4 JDK 动态代理1)代理工厂类:ProxyFactory2)客户端类3)JDK 动态代理原理4)动态代理的执行流程是什么样…...

JavaScript下载excel文件

文章目录 通过链接下载a标签下载方法注意 获取文件流请求体配置下载文件流 总结 通过链接下载 a标签 对于已知地址的目标文件&#xff0c;前端可以使用 a标签 来直接下载&#xff0c;使用a标签下载使用到两个属性 download&#xff1a;下载文件名href&#xff1a;目标文件下…...

研磨设计模式day12命令模式

目录 定义 几个参数 场景描述 代码示例 参数化设置 命令模式的优点 本质 何时选用 定义 几个参数 Command&#xff1a;定义命令的接口。 ConcreteCommand:命令接口的实现对象。但不是真正实现&#xff0c;是通过接收者的功能来完成命令要执行的操作 Receiver&#x…...

设计模式 06 适配器模式

适配器模式&#xff08;Adapter Pattern&#xff09;属于结构型模式 概述 结构型模式关注如何将现有的类或对象组织在一起形成更加强大的结构。 在生活中&#xff0c;我们经常遇到这样的一个问题&#xff1a;轻薄笔记本通常只有 type-c 或者 usb-a 接口&#xff0c;没有网口。…...

UE4/5Niagara粒子特效之Niagara_Particles官方案例:3.3->4.3

目录 3.3 Visibility Tag 左边的发射器&#xff1a; 发射器更新 粒子生成 粒子更新 右边的发射器 和左边发射器不同的地方 3.4 Texture Sampling 发射器更新 粒子生成 粒子更新 4.1Play Audio Per Particle 系统 第三个发射器 发射器更新 粒子生成 粒子更新 第二个…...

数据结构队列的实现

本章介绍数据结构队列的内容&#xff0c;我们会从队列的定义以及使用和OJ题来了解队列&#xff0c;话不多说&#xff0c;我们来实现吧 队列 1。队列的概念及结构 队列&#xff1a;只允许在一端进行插入数据操作&#xff0c;在另一端进行删除数据操作的特殊线性表&#xff0c;…...

网站建设金手指稳定/百度首页排名优化服务

目录 第一部 Java入门 第二部 开发框架【知识深度升华】 第三部 【扩展知识广度】 第四部 【源码学习】 第一部 Java入门 &#xff08;根据你聪明智慧&#xff1a;建议快速游览大致了解都是有什么东东就行了&#xff09; https://www.nowcoder.com/stack/23 jav…...

电子商务网站建设下载/百度搜索排名优化

有名信号量 semphore如果说信号是外部事件和进程的关联的机制的话&#xff0c;那么信号量就是进程、线程之间通信的机制。根据是支持不同进程之间的通信还是同一个进程内不同线程的通信&#xff0c;信号量可以分为有名信号量和无名信号量。顾名思义&#xff0c;有名信号量在建立…...

wordpress怎么重装/百度知道灰色词代发收录

首页和图标定制 首页 图标定制 1.图片命名为favicon.ico 2.放在public目录下 3.更改配置 #关闭默认图标 &#xff0c;新版本没有 spring.mvc.favicon.enabledfalse4.测试访问...

商洛网站设计/怎么让网站被百度收录

之前提到java.util.concurrent包中的原子类&#xff0c;就是通过CAS来实现了乐观锁&#xff0c;那么我们进入原子类AtomicInteger的源码&#xff0c;看一下AtomicInteger的定义&#xff1a; 根据定义我们可以看出各属性的作用&#xff1a; unsafe&#xff1a; 获取并操作内存的…...

武汉网站建设供应商/郑州seo服务公司

A:close()关闭流对象&#xff0c;但是先刷新一次缓冲区。关闭之后&#xff0c;流对象不可以继续再使用了。B:flush()仅仅刷新缓冲区,刷新之后&#xff0c;流对象还可以继续使用。 1字符 2字节 文件中数据存储的基本单位是字节。...

有没有做彩票直播的网站/整合营销什么意思

返回json需要jsonplugin-0[1].25的jar包 然后我们的配置文件中需要继承json-default Java 代码1. <?xml version"1.0" encoding"UTF-8" ?>2. <!DOCTYPE struts PUBLIC3. "-//Apache Software Foundation//DTD Struts Configuration 2.0//E…...