话说O哥之前曾在帖子中提及过,旅游贴的每张照片都是精挑细选,再用Windows的画图软件(Paint)一张张修改尺寸后,才上传到HIVE上来,蠢得不得了。
(图源 :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%,一秒钟都不到,大大地减轻了我的工作。
随便弄张图片测试一下
缩图后
哎,有些后悔,自己之前为什么就这么懒惰呢?白白浪费了多少大好时光呀?
话说,用Python+OpenCV实现了我想要的调整图片尺寸功能后,发现OpenCV真的是超级强大呀,功能超多,真是个好东东呀,以后有时间决定好好学习一下。