python批量裁剪图片
2023年6月10日 - 由Bo 0 评论 486 阅读
今天翻到了以前下载的老漫画,是jpg格式的文件,可是放在手机上却发现一张图是包含了两页的,这在手机观看就看不清楚了得不停放大拖拽。于是打算用小段程序来裁剪图片,将每一张图片都切成两半,适用于手机观看。涉及到的代码不难,只是记录一下,或许有人也有需要,可以直接拷贝用起来。
首先观察了一下漫画的原目录,里面包含了章节,章节里面可能还有上目录分第几部,并不固定。打算以文件夹递归的方式来判断,原目录不动,先自动创建和原目录一样的文件夹结构,然后在遍历每个目录下文件的时候,对图片文件裁剪为两个分别命名,其他文件则直接复制。用到的是pathlib和opencv。
代码如下,有部分注释:
from pathlib import Path
import shutil
import cv2
def create_folder_if_not_exist(folder_path):
# 目录若不存在就创建一个,以匹配原目录
if not folder_path.exists():
print(f"save folder not exist, create it: {str(folder_path)}")
folder_path.mkdir(parents=True, exist_ok=True)
else:
print(f"folder exist, not create: {str(folder_path)}")
def remove_useless_path_parts(parts, load_folder_str):
# 获取章节、文件等信息,用于拼接新目录
new_parts = []
for p in parts:
if p not in load_folder_str:
new_parts.append(p)
print(f"new parts are: {new_parts}")
return new_parts
if __name__ == "__main__":
load_folder = "" # 原目录路径
save_folder = "" # 新目录路径,可以用于处理多套漫画
comic_name = "漫画根目录名字"
load_path = Path(load_folder).joinpath(comic_name)
save_path = Path(save_folder).joinpath(comic_name)
create_folder_if_not_exist(save_path)
for i in load_path.glob("**/*"):
print(i)
if i.is_dir():
create_folder_if_not_exist(Path(save_folder).joinpath(*remove_useless_path_parts(i.parts, load_folder)))
elif i.is_file():
print("split image and save")
if i.suffix.split(".")[-1].lower() not in ["jpg", "jpeg", "png", "bmp"]:
# 非图片的则直接复制过去
print(f"{i.name} not a image, copy file instead of cut file")
shutil.copy(i, Path(save_folder).joinpath(*remove_useless_path_parts(i.parts, load_folder)))
else:
try:
# 读取图片,通过宽度均等拆分为2个文件,并由原文件名新增后缀,保存到新目录去
img = cv2.imread(str(i))
mid = int(img.shape[1] / 2)
new_parts_1 = remove_useless_path_parts(i.parts, load_folder)
temp = new_parts_1[-1].split(".")
temp[0] += "_1"
new_parts_1[-1] = ".".join(temp)
print("save left part as 1")
cv2.imwrite(str(Path(save_folder).joinpath(*new_parts_1)), img[:, 0:mid])
new_parts_2 = remove_useless_path_parts(i.parts, load_folder)
temp = new_parts_2[-1].split(".")
temp[0] += "_2"
new_parts_2[-1] = ".".join(temp)
print("save right part as 2")
cv2.imwrite(str(Path(save_folder).joinpath(*new_parts_2)), img[:, mid:])
except AttributeError:
print(f"cannot load image: {str(i)}")