oflyhigh avatar

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

oflyhigh

Published: 10 Oct 2023 › Updated: 10 Oct 2023每天进步一点点:使用Python批量修改图片尺寸

每天进步一点点:使用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真的是超级强大呀,功能超多,真是个好东东呀,以后有时间决定好好学习一下。

相关链接

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

Written by

Programmer, Maker, Freelancer, Witness. Make friends, Make money, Make life better!

Read more #cn posts


Best Posts From oflyhigh

We have not curated any of oflyhigh's posts yet. But you can encourage our curation team to review posts by visiting them regularly and by referring other readers. Because we give priority to frequently read content.

More Posts From oflyhigh