Переименование, обрезка, ресайз и сортировка изображений

Сперва задача мне показалась не сложной и я не стал заморачиваться написанием кода, потому что было немного страшно застрять на этой задаче.

На первую партию изображений пришлось потратить не очень много времени, около часа, чтобы все подготовить, хотя я очень плохо чувствую время за работой, может быть было дольше.

Я решил проделать то же самое со второй партией, но в какой то момент ошибся и удалил все изображения, с которыми до этого работал. 10-15 минут исчезли из жизни напрасно. Меня это очень задело и я все же решился написать код, который написал за час, а с задачей он справляется автоматически за пару минут.

Сохраняю себе на заметку.

import os
import sys
import csv
from PIL import Image, ImageDraw
import unittest
import shutil
import re

<i>class</i> ImageEditor:
<i>def</i> __init__(<i>self</i>, <i>folder</i>):
self.folder = folder
self.sizes = (1200,1200)

<i>def</i> test(<i>self</i>):
# self.createTestImage('п-333,3в.jpg')
self.fileList = self.getListFiles()
for file in self.fileList:
            file = self.renameFileUppercase(file)
self.crop(file)
self.resize(file)
self.createDir(file)

self.rename_files_in_directories()


<i>def</i> getListFiles(<i>self</i>):
return [file for file in os.listdir(self.folder)]

<i>def</i> createTestImage(<i>self</i>, <i>testFileName</i>="П-123.jpg"):  
# Создаем пустое изображение размером 200x200 пикселей и белым фоном
        width, height = 2200, 2900
        image = Image.new("RGB", (width, height), "white")

# Создаем объект для рисования на изображении
        draw = ImageDraw.Draw(image)

# Рисуем на изображении (например, рисуем красный квадрат)
        left_top = (50, 50)
        right_bottom = (150, 150)
        draw.rectangle([left_top, right_bottom], <i>outline</i>="red", <i>width</i>=2)

# Сохраняем изображение в файл
        image.save(os.path.join(self.folder, testFileName))

# Закрываем изображение (необязательно, но рекомендуется)
        image.close()

<i>def</i> start(<i>self</i>, <i>folder</i>):
pass

<i>def</i> rename_files_in_directories(<i>self</i>):
for root, _, files in os.walk(self.folder):
for index, file_name in enumerate(files, <i>start</i>=1):
                new_file_name = f'{os.path.basename(root)}_{index:02d}.jpg'
                source_path = os.path.join(root, file_name)
                new_path = os.path.join(root, new_file_name)

                os.rename(source_path, new_path)

print(f'Переименован файл: {source_path} -> {new_path}')

<i>def</i> createDir(<i>self</i>, <i>file</i>):
        sku = re.match(<i>r</i>'П-\d{1,3}', file)

if sku is not None:
            sku = sku[0]
else:
            sku = file

if not os.path.exists(os.path.join(self.folder, sku)):
            os.mkdir(os.path.join(self.folder, sku))

        shutil.move(os.path.join(self.folder, file), os.path.join(self.folder, sku))

print(os.path.join(self.folder, file))

<i>def</i> sort(<i>self</i>, <i>file</i>):
pass

<i>def</i> crop(<i>self</i>, <i>file</i>):
# Откройте изображение
        image = Image.open(os.path.join(self.folder, file))  # Замените "input_image.jpg" на ваш путь к изображению

# Определите, какая сторона больше: ширина или высота
if image.width > image.height:
# Если ширина больше, используйте высоту для обрезки
            size = image.height
else:
# Если высота больше или равна ширине, используйте ширину для обрезки
            size = image.width

# Вычислите координаты верхнего левого и нижнего правого углов для обрезки
        left = (image.width - size) // 2
        top = (image.height - size) // 2
        right = left + size
        bottom = top + size

# Обрежьте изображение с сохранением соотношения сторон
        cropped_image = image.crop((left, top, right, bottom))

# Сохраните обрезанное изображение
        cropped_image.save(os.path.join(self.folder, file))  # Замените на путь для сохранения

# Закройте изображение (по завершении)
        image.close()

print("Изображение обрезано в соотношение сторон 1 к 1")

<i>def</i> resize(<i>self</i>, <i>file</i>):
        image = Image.open(os.path.join(self.folder, file))

if image.size[0] < self.sizes[0]:
print(f'Изображение {file} не может быть уменьшено, так как его размер меньше')
print(image.size)
            image.close()
return

        resizedImage = image.resize(self.sizes)
        resizedImage.save(os.path.join(self.folder, file))
        image.close()
print(f'Размер изображения изменен {file} 1200х1200')

<i>def</i> renameFileUppercase(<i>self</i>, <i>file</i>):
        new_name = file.upper()
        os.rename(os.path.join(self.folder, file),
                  os.path.join(self.folder, new_name))
return new_name


<i>def</i> renameAllFiles(<i>self</i>):
pass


if __name__ == '__main__':
    imageEditor = ImageEditor('test_dir2')
    imageEditor.test()