Day5:使用Python脚本完成批量图片处理
批量图片处理
日常工作中,经常会遇到要批量的给图片加滤镜,加水印,按需求缩放图片等操作,如果不懂编程,可能就需要你用ps一张一张的打开图片,修改图片再保存,大量的重复工作将占用你很多宝贵的时间。如果需要处理的图片量大,即便是加班,也不一定能及时完成工作,且及其容易操作失误导致出错。
好在之前的任务中,我们已经掌握了批量搜索和处理文件的能力,也知道了如何用python来读写文件,现在我们只需要掌握任意一种图片处理库,就能很方便的用脚本来帮助我们完成今天的任务。
第三方库的使用
前面的任务中,我们使用的是python核心库中的模块,核心库中的模块,只需要import到当前脚本中就能调用模块中的功能。但此次任务,我们需要使用到功能并没有被包含的核心库,而是由第三方库提供,因此我们需要在自己的机器中安装第三方库。
opencv,matplotlib,Pillow是目前比较流行的支持图片处理的第三方库。
- opencv:有多种语言版本,是最为专业的图像处理库,掌握opencv的使用方法,即便不适用python,也能在其他语言的移植版本中很快上手使用。
- matplotlib:是一个强大的绘图工具包,在很多数据可视化和大数据项目中都有使用,基本的图像处理自然也不在话下。
- Pillow与上面两个库不同,他源自PIL(Python Imaging Library),尽管没有被包含在python是核心库中,但Pillow是python专用的图像处理库,上手也相对容易。
在未来我们涉及到图像识别 数据可视化等高级内容时,我们会有机会为大家讲解opencv和matplotlib,今天我们就先从Pillow入手来开始学习第三方库的使用。pip全局安装第三方库
通过在Linux终端(或windows命令行)输入命令安装一个第三方库
pip install pillow
安装成功以后我们通过python启动repl来测试新安装的库,不过在我们此次任务中,我们需要的是自动化运行批处理任务的脚本,而不是手动在repl中一行一行的代码来执行。图像缩放
创建imageResize.py文件
# 从PIL模块中导入Image对象,我们需要的缩放功能由Image对象提供
from PIL import Image
# 打开一个jpg图像,使用相对路径,打开文件的操作已经被Image对象库封装
img = Image.open('dog.jpg')
# 获得图像尺寸:
w, h = im.size
# print打印字符串使用字符串格式化输出图像大小,字符串中的%s为占位符
print('源图像大小为: %sx%s' % (w, h))
# 宽,高各自除以2,缩小到原来的一半
img.thumbnail((w/2, h/2))
# 把缩放后的图像用jpeg格式保存:
im.save('thumbdog.jpg', 'jpeg')
大部分的第三方库,使用pip install命令安装和使用ipmort导入的名称是相同的,但这里安装第三方库时,使用的库名称是pillow,导入包使用的是PIL,名称不一致。因为老版本的PIL只支持到python2.7,已经缺乏维护。在python3中,社区的开发者完全兼容老版本PIL的用法新发布了pillow
图像滤镜
图像滤镜是图像处理中经常需要用到的操作,比如美颜中的磨皮操作就能让人肤白貌美,这个磨皮就用到了模糊滤镜;把彩色照片转化成黑白照片或者老旧照片就需要用到颜色滤镜,如果你对位图的的数据编码方式非常熟悉,你可以自己利用PIL创造特定的滤镜。(比较有难度,通常大部分开发者都不会自己去创建滤镜)
好在PIL已经预定一了一组常用滤镜,我们不需要知道细节就能直接使用。
我们以模糊滤镜为例
创建imageFilter.py文件
from PIL import Image, ImageFilter
# 打开一个jpg图像文件,注意是当前路径:
im = Image.open('dog.jpg')
# 应用模糊滤镜:
img = im.filter(ImageFilter.BLUR)
img.save('blurDog.jpg', 'jpeg')
ImageFilter.BLUR中的BLUR就是PIL预定一的模糊滤镜
我希望你自己能测试一下其他的与定义滤镜,看看它们分别都有哪些效果
BLUR
CONTOUR
DETAIL
EDGE_ENHANCE
EDGE_ENHANCE_MORE
EMBOSS
FIND_EDGES
SHARPEN
SMOOTH
SMOOTH_MORE_
绘图方法
PIL的ImageDraw提供了一系列绘图方法,可能有人会想,画图不应该是设计师用ps画的吗,为什么会需要用python程序画图。
其实想想身边的场景,你会发现很多时候机器画图有时候是无法替代的,比如生成网页表单验证码或者给图片加水印。
为图片添加水印的例子
# 导入包
from PIL import Image,ImageDraw,ImageFont
# 图片路径,必须是当前目录下
imagefile="dog.jpg"
# 打开图片
imageInfo=Image.open(imagefile)
# 获取图片尺寸
print(imageInfo.size)
# 设置图片水印的字体的字号
fontOne = ImageFont.truetype("C:\Windows\Fonts\Arial.ttf", 36)
fontTwo = ImageFont.truetype("C:\Windows\Fonts\Arial.ttf", 36)
# 创建Draw对象,用于之后绘制文字
draw=ImageDraw.Draw(imageInfo)
# 设置水印文字的位置(x,y),文本,颜色,字体字号
draw.text((imageInfo.size\[0] / 11, imageInfo.size\[1] / 20), "我爱学习,学习使我妈快乐", fill=(255, 0, 0), font=fontOne)
draw.text((imageInfo.size\[0] / 11, imageInfo.size\[1] / 20 + 40), "我妈快乐全家快乐", fill=(20, 150, 200), font=fontTwo)
# 图片预览
imageInfo.show()
# 图片保存
imageInfo.save("DogWaterMark.jpg")
如果运行报错,可能是系统找不到字体造成的,由于我使用苹果设备来编写文档,本例中使用的Arial是苹果操作系统自带字体,你们可以把font中设置为自己已电脑中已经安装的字体。
程序设计
把今天学习的内容结合之前文件搜索的任务,完成对某个文件夹内文件批量搜索并添加水印的程序。
相关推荐
Python实现将通信达.day文件读取为DataFrame
总结起来,Python实现将通信达.day文件读取为DataFrame涉及的关键点有:1. 使用`os`库处理文件路径,`struct`库解析二进制数据。2.
python 微信自动打卡脚本微信自动打卡脚本
接着,使用`schedule.every().day.at()`方法设置了多个定时任务,这些任务会在每天的指定时间(例如8:30、9:30等)执行`job`函数,即发送打卡消息。
Python批量处理栅格转矢量Raster to Vector
**打印结果**:每完成一个文件的转换,都会打印出文件路径、基础名称以及完成状态的消息。### 总结该脚本适用于批量处理栅格数据到矢量数据的转换任务,特别适用于地理空间数据的预处理阶段。
【飞桨深度学习 && 百度七日打卡 && Python小白逆袭大神】Day5:综合大作业
【飞桨深度学习 && 百度七日打卡 && Python小白逆袭大神】Day5:综合大作业在本文中,我们将探讨的是一个针对初学者的深度学习项目,它结合了飞桨(PaddlePaddle)深度学习框架和Python
python打卡DAY5
**函数高级用法**:函数是编程中的核心概念之一。在Python打卡DAY5的课程中,可能会涉及到高阶函数的应用,比如函数作为参数传递给其他函数,或者从其他函数中返回一个函数。


