每天进步一点点:使用Python批量修改图片尺寸

话说O哥之前曾在帖子中提及过,旅游贴的每张照片都是精挑细选,再用Windows的画图软件(Paint)一张张修改尺寸后,才上传到HIVE上来,蠢得不得了。

image.png
(图源 :pixabay)

之所以修改尺寸,是因为照片的原始尺寸太大,占用公用图床空间不说,上传下载都会很慢。上传的话我可以慢慢等,但是下载的话,就会影响大家的阅读体验了,所以合适的尺寸还是很重要的。

这样傻傻地弄了几年之后,我下定决心写段代码来处理这件事情。毕竟时不时地改几十张图片的尺寸,实在是太累人了。最终决定用Python来帮我坐这件事情。

为了实现这个功能,我在Windows上安装了Python embeddable版本,并且使用virtualenv创建Python的虚拟运行环境,然后又拖了两个多月。这两天又被修改图片尺寸烦得不得了,于是下定决心,一定要把代码写出来。

调整图片尺寸

有好多方法可以使用Python来调整图片的尺寸,常用可以使用Pillow库或者OpenCV库来操作。经过简单的对比之后,我最终决定使用OpenCV库来处理——据说它会更快一些。

在程序中使用如下语句导入OpenCV支持:

import cv2

如果你的Python环境还没安装OpenCV库支持,那么请使用以下指令安装:

pip install opencv-python

否则上述导入语句将会提示如下错误:

ModuleNotFoundError: No module named 'cv2'

我们可以使用如下语句读入图像,读入后就可以对其进行操作了

img = cv.imread('test.jpg')

因为我要的是按比例缩放(主要是缩),所以我们需要获取图像的原始尺寸,我们可以使用img.shape来获取图像的尺寸,它返回一个数组,分别对应图像的:宽、长、通道数。

所以我们要对上述图片进行等比例缩小,那么需要获取新的缩小后的长宽(width、height)

width = int(img.shape[1] * scale_percent / 100)
height = int(img.shape[0] * scale_percent / 100)

然后使用cv2.resize对图像进行缩放

dim = (width, height)
resized_img = cv2.resize(img, dim, interpolation=cv2.INTER_AREA)

最后再将缩放后的图片保存(可以根据需要选择覆盖或者不覆盖原图):
cv2.imwrite(file_path, resized_img)

我们可以将其封装成一个函数:

def resize_image(file_path, scale_percent):
    img = cv2.imread(file_path)
    width = int(img.shape[1] * scale_percent / 100)
    height = int(img.shape[0] * scale_percent / 100)
    dim = (width, height)
    resized_img = cv2.resize(img, dim, interpolation=cv2.INTER_AREA)
    cv2.imwrite(file_path, resized_img)

完整代码

有了上述函数,再加上一个遍历指定文件夹的代码,就可以满足我的需求啦。我们可以使用以下代码遍历指定文件夹:

for file_name in os.listdir(folder_path):
     do xxx

完整的代码如下:

import os
import sys
import cv2

folder_path = 'F:\_temp'
scale_percent = 40

def resize_image(file_path, scale_percent):
    img = cv2.imread(file_path)
    width = int(img.shape[1] * scale_percent / 100)
    height = int(img.shape[0] * scale_percent / 100)
    dim = (width, height)
    resized_img = cv2.resize(img, dim, interpolation=cv2.INTER_AREA)
    cv2.imwrite(file_path, resized_img)

def main(argv=None):
    for file_name in os.listdir(folder_path):
        if file_name.endswith('.jpg') or file_name.endswith('.png'):
            print(file_name)
            file_path = os.path.join(folder_path, file_name)
            resize_image(file_path, scale_percent)

if __name__ == "__main__":
    sys.exit(main())

其中添加了对图像文件的检查,以及指定对应目录、缩放尺寸等等。

现在随便丢一些文件到对应目录,然后执行相应的Python文件,就可以一下子把目录内的所有图片长宽均缩小至原来的40%,一秒钟都不到,大大地减轻了我的工作。

随便弄张图片测试一下
image.png

缩图后
image.png

哎,有些后悔,自己之前为什么就这么懒惰呢?白白浪费了多少大好时光呀?

话说,用Python+OpenCV实现了我想要的调整图片尺寸功能后,发现OpenCV真的是超级强大呀,功能超多,真是个好东东呀,以后有时间决定好好学习一下。

相关链接

H2
H3
H4
3 columns
2 columns
1 column
Join the conversation now