Сперва задача мне показалась не сложной и я не стал заморачиваться написанием кода, потому что было немного страшно застрять на этой задаче.
На первую партию изображений пришлось потратить не очень много времени, около часа, чтобы все подготовить, хотя я очень плохо чувствую время за работой, может быть было дольше.
Я решил проделать то же самое со второй партией, но в какой то момент ошибся и удалил все изображения, с которыми до этого работал. 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()