第8章: 图像批处理与自动化

news2024/11/18 5:36:22

在实际工作中,经常需要对大量图像执行重复性的操作,例如批量调整大小、添加水印、转换格式等。使用 Pillow 进行图像批处理和自动化操作,可以极大地提升效率,减少手动操作。

1.1 批量图像读取与保存

在批量处理时,首先需要读取文件夹中的所有图像文件并加载到内存中,然后对其进行保存。

1.1.1 批量读取文件

Python 的 os 模块和 glob 模块可以帮助我们遍历文件夹中的图像文件。

import os
from PIL import Image

# 设置图像文件夹路径
folder_path = "./images"

# 遍历文件夹中的所有图像文件
for filename in os.listdir(folder_path):
    if filename.endswith((".jpg", ".png")):
        image_path = os.path.join(folder_path, filename)
        image = Image.open(image_path)
        image.show()
1.1.2 批量保存图像

在处理完图像后,可以通过 save() 方法将图像保存到指定路径。

output_folder = "./output_images"
os.makedirs(output_folder, exist_ok=True)

for filename in os.listdir(folder_path):
    if filename.endswith((".jpg", ".png")):
        image_path = os.path.join(folder_path, filename)
        image = Image.open(image_path)
        
        # 处理后的图像保存
        output_path = os.path.join(output_folder, filename)
        image.save(output_path)

案例:将文件夹中所有图片转换为 PNG 格式并另存为新的文件夹。


1.2 批量调整图像大小

批量调整图像大小常用于生成缩略图或对图像进行压缩,便于上传和存储。

# 批量调整大小
for filename in os.listdir(folder_path):
    if filename.endswith((".jpg", ".png")):
        image_path = os.path.join(folder_path, filename)
        image = Image.open(image_path)
        
        # 调整图像大小
        resized_image = image.resize((800, 600))  # 指定新的尺寸
        resized_image.save(os.path.join(output_folder, filename))

案例:将图像批量调整为指定尺寸,用于网站的缩略图展示。


1.3 批量添加水印

在批量处理中,常见的需求是为所有图像添加水印。可以创建一个水印图像,将其叠加到每一张图片上。

watermark = Image.open("watermark.png").convert("RGBA")

for filename in os.listdir(folder_path):
    if filename.endswith((".jpg", ".png")):
        image_path = os.path.join(folder_path, filename)
        image = Image.open(image_path).convert("RGBA")
        
        # 调整水印大小
        wm_resized = watermark.resize((image.width // 5, image.height // 5))
        
        # 将水印叠加到图像右下角
        image.paste(wm_resized, (image.width - wm_resized.width, image.height - wm_resized.height), wm_resized)
        image.save(os.path.join(output_folder, filename))

案例:对文件夹内所有图片添加右下角水印,适用于图片版权保护。


1.4 批量格式转换

将图像格式转换为其他常用格式(如 JPEGPNGGIF)是图像批处理的重要操作之一。

# 将所有图像批量转换为JPEG格式
for filename in os.listdir(folder_path):
    if filename.endswith(".png"):
        image_path = os.path.join(folder_path, filename)
        image = Image.open(image_path)
        
        # 转换并保存为JPEG格式
        new_filename = os.path.splitext(filename)[0] + ".jpg"
        image = image.convert("RGB")
        image.save(os.path.join(output_folder, new_filename), "JPEG")

案例:将文件夹中所有 PNG 图像批量转换为 JPEG 格式,以便在不支持透明度的场景下使用。


1.5 批量调整图像质量

批量降低图像的质量可以有效减小文件大小,适用于需要上传到网络的场景。

# 将图像质量设置为80%,并批量保存
for filename in os.listdir(folder_path):
    if filename.endswith((".jpg", ".jpeg")):
        image_path = os.path.join(folder_path, filename)
        image = Image.open(image_path)
        
        # 设置压缩质量
        image.save(os.path.join(output_folder, filename), quality=80)

案例:批量压缩图像质量,用于减少文件体积。


1.6 批量图像旋转和翻转

批量旋转和翻转图像在处理拍摄角度不一致的图片时非常有用。例如,可以将所有图像旋转 90 度或水平翻转。

# 批量旋转图像
for filename in os.listdir(folder_path):
    if filename.endswith((".jpg", ".png")):
        image_path = os.path.join(folder_path, filename)
        image = Image.open(image_path)
        
        # 旋转90度
        rotated_image = image.rotate(90, expand=True)
        rotated_image.save(os.path.join(output_folder, filename))

案例:将图片批量旋转,用于标准化拍摄角度。


1.7 批量图像颜色调整

批量调整图像的亮度、对比度或颜色平衡,用于使所有图像呈现一致的风格。

from PIL import ImageEnhance

# 批量调整图像亮度
for filename in os.listdir(folder_path):
    if filename.endswith((".jpg", ".png")):
        image_path = os.path.join(folder_path, filename)
        image = Image.open(image_path)
        
        # 调整亮度
        enhancer = ImageEnhance.Brightness(image)
        enhanced_image = enhancer.enhance(1.5)  # 增强亮度
        enhanced_image.save(os.path.join(output_folder, filename))

案例:对一组图片进行亮度或对比度增强,适用于统一视觉效果的场景。


1.8 自动化批处理脚本

可以将上述批处理操作封装到一个脚本中,以实现一键式批量处理。

import os
from PIL import Image, ImageEnhance

def batch_process_images(input_folder, output_folder, resize=None, watermark_path=None, format_conversion=None, quality=None):
    os.makedirs(output_folder, exist_ok=True)
    
    # 加载水印图像
    watermark = None
    if watermark_path:
        watermark = Image.open(watermark_path).convert("RGBA")
    
    # 批量处理图像
    for filename in os.listdir(input_folder):
        if filename.endswith((".jpg", ".png")):
            image_path = os.path.join(input_folder, filename)
            image = Image.open(image_path)
            
            # 调整大小
            if resize:
                image = image.resize(resize)
                
            # 添加水印
            if watermark:
                wm_resized = watermark.resize((image.width // 5, image.height // 5))
                image.paste(wm_resized, (image.width - wm_resized.width, image.height - wm_resized.height), wm_resized)
            
            # 格式转换
            output_filename = filename
            if format_conversion:
                output_filename = os.path.splitext(filename)[0] + f".{format_conversion.lower()}"
                image = image.convert("RGB") if format_conversion.lower() == "jpeg" else image
                
            # 调整质量并保存
            save_params = {"quality": quality} if quality else {}
            image.save(os.path.join(output_folder, output_filename), **save_params)

# 使用脚本进行批处理
batch_process_images(input_folder="./images", output_folder="./output_images", resize=(800, 600), watermark_path="watermark.png", format_conversion="JPEG", quality=80)

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

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

相关文章

Vue2教程002:Vue指令

文章目录 2、Vue指令2.1 开发者工具2.2 v-html2.3 v-show和v-if2.4 v-else和v-else-if2.5 v-on2.5.1 内联语句2.5.2 methods 2、Vue指令 2.1 开发者工具 通过谷歌应用商店安装(需要科学上网)通过极简插件安装 2.2 v-html Vue会根据不同的指令&#x…

计算机视觉 ---图像模糊

1、图像模糊的作用: 减少噪声: 在图像获取过程中,例如通过相机拍摄或者传感器采集,可能会受到各种因素的干扰,从而引入噪声。这些噪声在图像上表现为一些孤立的、不符合图像主体内容的像素变化,如椒盐噪声&…

[JAVA]MyBatis框架—如何获取SqlSession对象实现数据交互(基础篇)

假设我们要查询数据库的用户信息,在MyBatis框架中,首先需要通过SqlSessionFactory创建SqlSession,然后才能使用SqlSession获取对应的Mapper接口,进而执行查询操作 在前一章我们学习了如何创建MyBatis的配置文件mybatis.config.xm…

node.js下载安装步骤整理

>> 进入node.js下载页面下载 | Node.js 中文网 >>点击 全部安装包 >>删除网址node后面部分,只保留如图所示部分,回车 >>点击进入v11.0.0/版本 >>点击下载node-v11.0.0-win-x64.zip(电脑是windows 64位操作系统适用) >…

解决IntelliJ IDEA的Plugins无法访问Marketplace去下载插件

勾选Auto-detect proxy setting并填入 https://plugins.jetbrains.com 代理URL,可以先做检查连接:

解决Jenkins使用 Git 参数插件拉取 commit 列表缓慢问题

Jenkins使用 Git 参数插件拉取 commit 列表缓慢问题 项目问题问题描述解决方案具体实现 项目问题 在 Jenkins 中使用 Git 参数插件 进行参数化构建,具有多方面的重要性和好处。这不仅提高了构建的灵活性和透明度,还能大大提升开发和运维效率。以下是使用…

Pytest-Bdd-Playwright 系列教程(9):使用 数据表(DataTable 参数) 来传递参数

Pytest-Bdd-Playwright 系列教程(9):使用 数据表(DataTable 参数) 来传递参数 前言一、什么是 datatable 参数?Gherkin 表格示例 二、datatable 参数的基本使用三、完整代码和运行效果完整的测试代码 前言 …

Windows内核编程准备

Windows内核编程 驱动 本课程涉及的驱动,是利用驱动程序的高级权限,去做一些用户层不能做的工作,严格来说,这些写出来的东西不能算是驱动,因为它不会驱动任何设备 权限 内核程序是运行在R0级的,因此比应…

uni-app快速入门(八)--常用内置组件(上)

uni-app提供了一套基础组件&#xff0c;类似HTML里的标签元素&#xff0c;不推荐在uni-app中使用使用div等HTML标签。在uni-app中&#xff0c;对应<div>的标签是view&#xff0c;对应<span>的是text&#xff0c;对应<a>的是navigator&#xff0c;常用uni-app…

【代码大模型】Compressing Pre-trained Models of Code into 3 MB论文阅读

Compressing Pre-trained Models of Code into 3 MB key word: code PLM, compression, GA算法 论文&#xff1a;https://dl.acm.org/doi/pdf/10.1145/3551349.3556964 代码&#xff1a;https://github.com/soarsmu/Compressor.git 【why】 1.问题描述&#xff1a; code LLM …

论文《基于现实迷宫地形的电脑鼠设计》深度分析——智能车驱动算法

论文概述 《基于现实迷宫地形的电脑鼠设计》是由吴润强、庹忠曜、刘文杰、项璟晨、孙科学等人于2023年发表的一篇优秀期刊论文。其针对现阶段电脑鼠计算量庞大且不适用于现实迷宫地形的问题&#xff0c;特基于超声波测距与传统迷宫算法原理&#xff0c;设计出一款可在现实迷宫地…

PG-DERN 解读:少样本学习、 双视角编码器、 关系图学习网络

本文提出了一种用于 分子属性预测 的 少样本学习&#xff08;Few-shot Learning&#xff09; 模型—— PG-DERN&#xff0c;该模型结合了 双视角编码器&#xff08;Dual-view Encoder&#xff09; 和 关系图学习网络&#xff08;Relation Graph Learning Network&#xff09; 双…

w039基于Web足球青训俱乐部管理后台系统开发

&#x1f64a;作者简介&#xff1a;多年一线开发工作经验&#xff0c;原创团队&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取&#xff0c;记得注明来意哦~&#x1f339;赠送计算机毕业设计600个选题excel文…

H3C NX30Pro刷机教程-2024-11-16

H3C NX30Pro刷机教程-2024-11-16 ref: http://www.ttcoder.cn/index.php/2024/11/03/h3c-nx30pro亲测无需分区备份 路由器-新机初始化设置路由器登录密码telnet进入路由器后台 刷机上传uboot到路由器后台在Windows环境下解压后的软件包中打开 tftpd64.exe在NX30Pro环境下通过以…

[2024最新] java八股文实用版(附带原理)---java集合篇

介绍一下常见的list实现类&#xff1f; ArrayList 线程不安全&#xff0c;内部是通过数组实现的&#xff0c;继承了AbstractList&#xff0c;实现了List&#xff0c;适合随机查找和遍历&#xff0c;不适合插入和删除。排列有序&#xff0c;可重复&#xff0c;当容量不够的时候…

python 异步编程之协程

最近在学习python的异步编程&#xff0c;这里就简单记录一下&#xff0c;免得日后忘记。 首先&#xff0c;python异步实现大概有三种方式&#xff0c;多进程&#xff0c;多线程和协程&#xff1b;多线程和多进程就不用多说了&#xff0c;基本上每种语言都会有多进行和多线程的…

20241112-Pycharm使用托管的Anaconda的Jupyter Notebook

Pycharm使用托管的Anaconda的Jupyter Notebook 要求 不要每次使用 Pycharm 运行 Jupyter 文件时都要手动打开 Anaconda 的 Jupyter Notebook 正文 pycharm中配置好会自动安装的&#xff0c;有的要自己配置 Pycharm中配置 文件 ——> 设置 ——> 语言和框架……&am…

Android 无签名系统 debug 版本APK push到设备引起的开机异常问题分析(zygote进程)

问题背景 前置操作&#xff1a; 替换原system/priv-app 目录下已有的应用包未未签名的debug版本&#xff0c;然后重启。 现象&#xff1a; 无法正常开机&#xff0c;卡在开机动画&#xff0c;并且pm没有起来&#xff0c;因为执行adb install 命令是返回“cmd: Cant find se…

【学习心得】数据分析三剑客跟学Gitee仓库

之前&#xff0c;自己在学习数据分析过程中的学习方法和思路&#xff0c;将那些摸索与实践中的心得体会分享出来&#xff0c;能够得到大家的喜欢、点赞我非常高兴&#xff0c;谢谢大家的支持&#xff01;这些正面的反馈对我来说&#xff0c;不仅是莫大的鼓励&#xff0c;更是持…

Vue 批量注册组件实现动态组件技巧

介绍 Vue 动态组件的应用场景很多,可应用于动态页签,动态路由等场景,其核心原理是批量注册。在Vue2和Vue3中实现原理相同,只是语法略有差异。 Vue2 实现 基于 webpack require.context() 是webpack提供的一个自动导入的API 参数1&#xff1a;加载的文件目录 参数2&#xff…