Python OpenCV 批量修改文件夹内所有图片的尺寸

Python OpenCV 批量修改文件夹内所有图片的尺寸

  • 简述
  • 插件
  • 遍历所有文件(包括子文件)
  • 缩放图片尺寸并保存图片
  • 遍历并修改图片

简述

遍历文件夹下的所有子文件(包括自文件夹内的)的图片批量修改尺寸,并将修改后的图片改为jpg,放入指定文件夹内。
只适用于方图(因为需要处理Unity相关的美术资源)

插件

使用pip安装OpenCV第三方库

pip3 install opencv-python

遍历所有文件(包括子文件)

遍历所有文件(包括子文件)将文件路径传入元组

def show_files(path, all_files):
    # 首先遍历当前目录所有文件及文件夹
    file_list = os.listdir(path)
    # 准备循环判断每个元素是否是文件夹还是文件,是文件的话,把名称传入list,是文件夹的话,递归
    for file in file_list:
        # 利用os.path.join()方法取得路径全名,并存入cur_path变量,否则每次只能遍历一层目录
        cur_path = os.path.join(path, file)
        # 判断是否是文件夹
        if os.path.isdir(cur_path):
            show_files(cur_path, all_files)
        else:
            # 拼接文件路径
            all_files.append(path+"/"+file)
    return all_files

缩放图片尺寸并保存图片

将图片路径和保存路径传入。自动算出缩放比例。

def resize_img(img_path,save_path):
    # 读取原图片
    img = cv2.imread(img_path)
    h, w = img.shape[0], img.shape[1]
    print("Original h : " + str(h) + "px Original w : " + str(w) + "px")
    rate=img_width_height/h
    img_processing = cv2.resize(img, (0, 0), fx=rate, fy=rate, interpolation=cv2.INTER_NEAREST)
    # 这里改一下名称,最后三位强制改为jpg
    if save_path[-3:] == "png":
        save_path=save_path.replace("png", "jpg")
    cv2.imwrite(save_path, img_processing)
    print("Save as : " + save_path)

遍历并修改图片

详细的看注释,写的很明白。

import os
import cv2

# 所有需要处理的图片的路径 自动遍历文件夹内所有文件(包括子文件) 填写路径全称
traversal_file="/Users/slowfeather/Documents/PythonProject/ReSizeProject/OImg"
# 修改完成后输出的文件夹
output_file="/Users/slowfeather/Documents/PythonProject/ReSizeProject/OutPut"
# 变成多少分辨率的方形图
img_width_height=128

def resize_img(img_path,save_path):
    # 读取原图片
    img = cv2.imread(img_path)
    h, w = img.shape[0], img.shape[1]
    print("Original h : " + str(h) + "px Original w : " + str(w) + "px")
    rate=img_width_height/h
    img_processing = cv2.resize(img, (0, 0), fx=rate, fy=rate, interpolation=cv2.INTER_NEAREST)
    # 这里改一下名称,最后三位强制改为jpg
    if save_path[-3:] == "png":
        save_path=save_path.replace("png", "jpg")
    cv2.imwrite(save_path, img_processing)
    print("Save as : " + save_path)

def show_files(path, all_files):
    # 首先遍历当前目录所有文件及文件夹
    file_list = os.listdir(path)
    # 准备循环判断每个元素是否是文件夹还是文件,是文件的话,把名称传入list,是文件夹的话,递归
    for file in file_list:
        # 利用os.path.join()方法取得路径全名,并存入cur_path变量,否则每次只能遍历一层目录
        cur_path = os.path.join(path, file)
        # 判断是否是文件夹
        if os.path.isdir(cur_path):
            show_files(cur_path, all_files)
        else:
            # 拼接文件路径
            all_files.append(path+"/"+file)
    return all_files

# 首先检测两个路径是否都可访问,如果水印路径没有则创建
if os.path.isdir(traversal_file):
    print("Check traversal file ok")
else:
    print("Traversal file error")

if os.path.isdir(output_file):
    print("Check water mask file ok")
else:
    print("Water mask file warning,auto create it")
    os.mkdir(output_file)

#首先遍历文件夹,然后对每个文件进行处理
# 传入空的list接收文件名
contents = show_files(traversal_file, [])
# 循环打印show_files函数返回的文件名列表
for content in contents:
    # print(content)
    # 判断是否为图片
    if content.endswith('jpg') or content.endswith('png'):
        print("processing : "+content)
        resize_img(content,output_file + "/" +os.path.basename(content))

你可能感兴趣的:(Python)