【校园杂工】Python脚本处理档案图片之二

下午在玩儿狼人杀,作为萌新,每个汉字都听得懂,但是连在一起真的不知道是什么意思,而且各位大神刻意不搞我,穷极无聊之下只好把之前的文章写完。不过狼人杀这东东好烧脑,完全没有搞懂逻辑在哪里啊。

图片处理

处理档案图片中,最核心的操作就是把图片从原来的大图裁剪为小图,裁剪图片需要用的第三方库为pillow库,安装方法如下:

pip install pillow

像pillow这种非常程序的库,在readthedocs上https://pillow.readthedocs.io/ 有详细的文档的,python的第三方库实在是太多了,所以学会看文档是非常重要的。

打开图片

我们先来完成最核心的内容,完成图片的裁剪。首先我们如何用pillow打开并显示图片,注意Python文件main.py是跟我所有的图片是在同一个文件夹下的:

【校园杂工】Python脚本处理档案图片之二_第1张图片
main.py

明白文件结构有助于加载图片。

from PIL import Image

# 加载图片,注意路径
img = Image.open('LXM_0216.JPG')
img.show()

运行程序,会弹出一个窗口显示图片,我们先从PIL中导入Image模块,然后调用Images模块中的open方法打开图片以便于进行后面的操作,open方法的参数就是图片的路径,当然这里只是告诉大家如何用pillow库加载图片,真正处理的时候不需要调用show方法显示图片。

我们要裁剪图片,就需要知道图片原来的图片:

from PIL import Image

# 加载图片,注意路径
img = Image.open('LXM_0216.JPG')
w, h = img.size
print(w, h)

运行程序,输出结果如下:

D:\coding\docs\images>python main.py
3696 2448

我们调用open方法打开图片,得到图片对象,图片对象有一个size属性,以元组的形式保存了图片的尺寸,第5行w, h = img.size这种写法是Python对于多个元素复制的方法,img.size指为(3696, 2448),用这种方法可以分别给wh复制,分别代表图片的宽和高,我们用print语句打印w和h也证明了这一点。

裁剪图片

pillow库实在是太强大了,对于常见的图片操作都提供了相应的方法,我们可用thumbnail方法用来得到图片的缩略图,我们用Python的内置函数help来看下thumbnail方法是怎么用的:

from PIL import Image

# 加载图片,注意路径
img = Image.open('LXM_0216.JPG')
w, h = img.size
print(help(img.thumbnail))

open方法返回的图片对象有一个thumbnail方法得到图片的缩略图,我们用help方法也可以很清晰的看到thumbnail方法的用法,第1个参数是缩略图的尺寸,也是个元组,类似于坐标的数对。

其实吧,在交互式命令行摸索pillow库的使用也是非常方便的,感兴趣的可以自己尝试,我们把图片的宽和高都变为原来的一半,为了简单起见,我们把裁剪后的图片放到当前目录,并且给图片文件名加一个thumbnail:

from PIL import Image

# 加载图片,注意路径
img = Image.open('LXM_0216.JPG')
w, h = img.size
img.thumbnail((w//2, h//2))
img.save('thumbnail_LXM_0216.JPG')

我们把宽度和高度都重新设置为原来的一半,并且调用img对象的save方法保存裁剪后的图片,文件名加一个thumbnail前缀,运行程序,看下保存所有图片的文件夹:

【校园杂工】Python脚本处理档案图片之二_第2张图片
生成缩略图

然后我们就可以根据文件名排序,然后挑出所有的缩略图。
看下图片的属性:
【校园杂工】Python脚本处理档案图片之二_第3张图片
图片属性

然后看详细信息:
【校园杂工】Python脚本处理档案图片之二_第4张图片
详细嘻嘻

注意图片尺寸的变化,除了尺寸的变化,其实水平和垂直分辨率也发生了变化,这个跟thumbnail方法的第2个参数有关系:
【校园杂工】Python脚本处理档案图片之二_第5张图片
第2个参数

第2个参数决定了生成缩略图是如何重新对图片取样的。

兄台可能觉得,这很不自动化啊,充其量是半自动啊,但是饭要一口一口的吃啊,我们先完成最核心的功能,然后逐步迭代优化,直到完全满足我们的需求,实现全部的自动化,因为最开始的时候,我们只需要一个能够工作,提高我们工作效率,帮我们完成80%的重复性工作就好了,因为如果你要实现全部的自动化的话,可能需要耗费你80%的时间,开始的时候没有必要花80%的时间完成20%的功能的,我们要用20%的时间完成80%的功能的。我喜欢的是linux的软件设计哲学,瑞士军刀,小而巧,用各种小工具帮助我们完成任务,我们不需要vs studio这样的巨无霸*。

我们已经实现了加载图片,裁剪并另存缩略图了,接下来,我们只需要用上节课讲的知识点,遍历所有图片并且得到缩略图就可以了。

遍历所有图片

from PIL import Image
import os # 导入os模块
# 加载图片,注意路径
# img = Image.open('LXM_0216.JPG')
# w, h = img.size
# img.thumbnail((w//2, h//2))
# img.save('thumbnail_LXM_0216.JPG')
# 利用os模块的listdir方法得到当前文件夹
# 下所欲的图片
for file in os.listdir():
    # file代表是当前文件夹下
    # 的文件名,listdir得到的是
    # 包含当前文件夹所有文件文件名的
    # 列表
    img = Image.open(file)
    w, h  = img.size
    img.thumbnail((w//2, h//2))
    img.save('thumbnail_' + file)

大家注意到我的注释,如果代码不熟悉的情况下,可以把处理单张图片的代码注释掉,然后写for循环,for循环内部是处理单张图片的代码,所以我们就比照着前面的代码,写出处理每张图片的代码。

运行代码,查看代码的运行结果:

【校园杂工】Python脚本处理档案图片之二_第6张图片
代码运行结果

woao,好酷啊可以看到,生成了所有图片的缩略图。

小结

本文带领大家用pillow库处理图片并得到缩略图,然后用os模块的listdir方法得到当前文件夹下所有的图片并处理所有的图片。

问题

D:\coding\docs\images>python main.py
Traceback (most recent call last):
  File "main.py", line 9, in 
    img = Image.open(file)
  File "C:\Users\xpro\AppData\Local\Programs\Python\Python37\lib\site-packages\PIL\Image.py", line 2687, in open
    % (filename if filename else fp))
OSError: cannot identify image file 'main.py'

代码报错,不能确定图片文件main.py,所以我们在处理图片的时候要加一个判断,判断文件是不是图片,我们只需要判断文件的后缀是不是JPG就可以了:

from PIL import Image
import os # 导入os模块

for file in os.listdir():
    if file.endswith('JPG'):
        img = Image.open(file)
        w, h  = img.size
        img.thumbnail((w//2, h//2))
        img.save('thumbnail_' + file)

字符串的endswith方法是用于判断字符串是不是以某个字符串结尾,这里我们判断代表文件名的遍历file是不是以JPG结尾,用来判断listdir方法返回的包含所有文件名的列表中,每个文件名是不是JPG,也就是文件名代表的文件是不是图片,我们只处理图片文件,注意,这样还是有些问题的,希望有人看到,并求留言谢谢。

如果觉得文章还不错,点个好看,如果觉得真的很不错,麻烦转发下,如果觉得真的是太棒了,请转发到群(这么好的文章难道要我自己转发吗,不应该赶快让你们的朋友看到吗)谢谢。

PS:看他们玩儿狼人杀,感受到智商的碾压,感觉自己像是个傻子。。。真的是玩儿到大脑缺氧,每个人发言都好长啊

双PS:大神说,狼人杀是个会议游戏,你要去说服别人,然后提醒萌新,如果在职场balabala。。。。。。,好可怕的大神,真是非常激烈的游戏了。

叒PS:之前github的使用,只有东营的胡莹老师完成了:

【校园杂工】Python脚本处理档案图片之二_第7张图片
胡莹老师

你可能感兴趣的:(【校园杂工】Python脚本处理档案图片之二)