Bob's Blog

Web开发、测试框架、自动化平台、APP开发、机器学习等

返回上页首页

python批量裁剪图片



今天翻到了以前下载的老漫画,是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)}")

 

下一篇:  配置CUDA用于windows下yolo训练
上一篇:  Python爬虫(七)使用scrapy快速爬取全站页面

共有0条评论

添加评论

暂无评论