Day5:使用Python脚本完成批量图片处理

Python全栈技术社区 2021-09-22 19:28:46

批量图片处理

日常工作中,经常会遇到要批量的给图片加滤镜,加水印,按需求缩放图片等操作,如果不懂编程,可能就需要你用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中设置为自己已电脑中已经安装的字体。

程序设计

把今天学习的内容结合之前文件搜索的任务,完成对某个文件夹内文件批量搜索并添加水印的程序。

...全文
555 2 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
0人已提交
完成率0%
暂无数据
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
Python全栈技术社区 2021-09-22
精选
  • 打赏
  • 举报
回复

Day5练习作业:

详细阅读学习任务,完成对某个文件夹内文件批量搜索并添加水印的程序

作业提交

你可以这样做(任选其一):

1.将实验过程中遇到的问题、你的思考和想法整理成文字帖提交
2.录一个操作过程的视频放在帖子中提交
3.把你完成操作的代码结果拍照,照片放在帖子中提交

提交作业步骤:

1.进入 Python 全栈技术社区
2.点击右侧 “发帖子”,发布练习作业的内容,频道选择【7天学习】(标题格式:7天学习—dayX—标题)
3.进入Day5学习任务帖,点击“提交任务”按钮
4.填入发布作业的帖子链接后,确定提交

作业提交截止时间:
2021/9/24 19:00

此人很懒一月一改 7天学习首期学员 2021-09-23
  • 打赏
  • 举报
回复
第一段的代码中im应该是img吧 🤔

11,875

社区成员

发帖
与我相关
我的任务
社区描述
创建由Python学习者和社区专家组成的国内最大的第三方Python中文社区,帮助社区成员更好地入门学习、职业成长和应用实践
python学习 企业社区
社区管理员
  • Python全栈技术社区
  • Lumos_zbj
  • 北侠大卫
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

创建由Python学习者和社区专家组成的国内最大的第三方Python中文社区,帮助社区成员更好地入门学习、职业成长和应用实践

  • 这里有最新最全的 Python 学习内容及资源,每月多达4次技术公开课
  • 这里有众多 Python 学习者,陪伴你一起交流成长
  • 这里有专业 Python 社区专家、讲师,帮助你跨越学习瓶颈,解决实操难题
  • 这里有丰富的社区活动,可以开阔眼界,结识更多同伴

【最新活动】:

  1. 周四技术公开课讲师招募中,点击查看详情
  2. “Python 社区专家团” 招募中,点击查看详情

 

试试用AI创作助手写篇文章吧