python --批量转图片格式
单次转换
- from PIL import Image
-
- img = Image.open(r'C:\Users\EDY\Desktop\20220531203949.bmp')
- img.save(r'C:\Users\EDY\Desktop\20220531203949.png')
-
批量转换
- import os
- from PIL import Image
-
- class ImageToFormat(object):
- '''批量转图片格式'''
-
- def __init__(self, source_path: str, target_path: str, *, target_suffix='png'):
- """
- source_path: 需要转化的文件夹路径(程序会递归遍历当前路径下所有图片);
- target_path: 目标文件路径,会在目标路径下新建一个文件夹,并复制原始文件夹结构;
- target_suffix: 需要转换的图片后缀;
- """
- self._source_path = source_path
- self._target_path = target_path
- self._target_suffix = target_suffix
-
- @staticmethod
- def save_single(root: str, source_filename: str, suffix: str, target_path: str, target_suffix: str):
- try:
- img = Image.open(os.path.join(root, source_filename + suffix))
- img = img.convert('RGB')
- img.save(os.path.join(target_path, f'{source_filename}.{target_suffix}'), target_suffix)
- except Exception as e:
- print(e)
- return e
- return False
-
- @staticmethod
- def copy_single(root: str, source_filename: str, target_path: str):
- try:
- with open(os.path.join(root, source_filename), 'rb') as file:
- read = file.read()
- with open(os.path.join(target_path, source_filename), 'wb') as file:
- file.write(read)
- except Exception as e:
- print(e)
- return e
- return False
-
- def run(self):
- file_paths = []
- source_path_len = len(self._source_path)
-
- if not (self._source_path.endswith('/') or self._source_path.endswith('\\')):
- source_path_len += 1
-
- if not os.path.exists(self._target_path):
- os.makedirs(self._target_path)
-
- for root, directories, files in os.walk(self._source_path):
-
- for file in files:
- path = root[source_path_len:] # 去掉要被替换掉的目录前缀
- target_directory = os.path.join(self._target_path, path) # 这是新目录,要保存的位置
- file_paths.append((root, file, target_directory))
-
- for directory in directories: # 创建目录,要是把所有文件保存在同目录下,同名文件会冲突
- source_path = os.path.join(root, directory)
- path = source_path[source_path_len:]
- target_directory = os.path.join(self._target_path, path)
-
- if not os.path.exists(target_directory):
- os.makedirs(target_directory)
-
- for root, file, target in file_paths:
- fname, suffix = os.path.splitext(file)
- lower_suffix = suffix.lower()
-
- if lower_suffix in ('.jpg', '.jpeg', '.bmp', '.png'):
- ImageToFormat.save_single(root, fname, suffix, target, self._target_suffix)
-
- else:
- ImageToFormat.copy_single(root, file, target)
-
- r = ImageToFormat(r'D:\yi\game_resources\media', r'C:\Users\EDY\Desktop\新建文件夹1', target_suffix='bmp')
- r.run()
-