Добавить в корзинуПозвонить
Найти в Дзене

Автоматизация с Python: как изменить размер всех рисунков в папке

Сначала краткая предыстория, чтобы было понятно, зачем это надо. Я сейчас работаю в медицинской организации (МО), где из-за нехватки кадров приходится заниматься всякой фигнёй, в том числе размещением информации на сайтах. А сайты государственных медицинских учреждений находятся на платформе Госвеб (часть Госуслуг), с довольно убогим конструктором сайтов и большим количеством ограничений. В том числе есть и ограничения на размеры и формат рисунков - в новостях файлы рисунков должны быть определённых типов и иметь формат примерно 2:1. Поскольку новости МО должна публиковать не реже четырёх раз в неделю (в нашем государстве всё регламентировано, даже это), то загружать рисунки на сайт приходится довольно часто. Причём в новости обычно загружается не одна картинка, а несколько. Иногда 10 и более. А теперь проблема: люди, которые готовят новости, не заморачиваются с типами файлов и с форматом изображений. И часто дают квадратные картинки, которые, если их не изменить, будут обрезаны при за

Сначала краткая предыстория, чтобы было понятно, зачем это надо.

Я сейчас работаю в медицинской организации (МО), где из-за нехватки кадров приходится заниматься всякой фигнёй, в том числе размещением информации на сайтах. А сайты государственных медицинских учреждений находятся на платформе Госвеб (часть Госуслуг), с довольно убогим конструктором сайтов и большим количеством ограничений. В том числе есть и ограничения на размеры и формат рисунков - в новостях файлы рисунков должны быть определённых типов и иметь формат примерно 2:1.

Поскольку новости МО должна публиковать не реже четырёх раз в неделю (в нашем государстве всё регламентировано, даже это), то загружать рисунки на сайт приходится довольно часто. Причём в новости обычно загружается не одна картинка, а несколько. Иногда 10 и более.

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

Да, можно взять любой графический редактор, хоть тот же MS Paint, и увеличить в нём ширину рисунка, а саму картинку перенести в центр. С боков будут белые полосы, но на сайте это будет просто белый фон, который сольётся с белым фоном сайта, и пользователь увидит квадратное изображение целиком.

Так я раньше и делал. Однако мне это надоело, и я решил процесс автоматизировать - сделал скрипт на Python, который изменяет ширину квадратных изображений, и заодно преобразует их в тип PNG, который однозначно поддерживается платформой Госвеб.

Для использования этого скрипта потребуется библиотека Pillow, которая применяется для работы с изображениями. Установить её надо один раз через командную строку:

pip install Pillow

Затем создаём файл сценария. Я назвал его qToRec.py. Вы можете назвать как хотите. Ниже размещаю исходный код сценария. Сначала картинка для лучшего восприятия, потом текст, если кто-то захочет скопировать (только отступы придётся расставить самостоятельно - долбаный Python))):

Теперь текст:

import os
import tkinter as tk
from tkinter import filedialog, messagebox
from PIL import Image
import threading
def process_images(folder_path, status_label):
extensions = ('.jpg', '.jpeg', '.png', '.bmp')
files = [f for f in os.listdir(folder_path) if f.lower().endswith(extensions)]
for i, file in enumerate(files):
status_label.config(text=f"Обработка {i+1} из {len(files)}: {file}")
status_label.update()
input_path = os.path.join(folder_path, file)
img = Image.open(input_path)
height = img.size[1]
new_width = height * 2
canvas = Image.new('RGB', (new_width, height), 'white')
x_offset = (new_width - img.size[0]) // 2
canvas.paste(img, (x_offset, 0))
name, ext = os.path.splitext(file)
output_path = os.path.join(folder_path, f"{name}_2x1.png")
canvas.save(output_path, 'PNG')
messagebox.showinfo("Готово", f"Обработано {len(files)} файлов")
status_label.config(text="Готово!")
def main():
root = tk.Tk()
root.title("Конвертер изображений в 2:1")
root.geometry("400x150")
tk.Label(root, text="Нажмите кнопку и выберите папку с изображениями", pady=10).pack()
status_label = tk.Label(root, text="Ожидание выбора папки...", pady=5)
status_label.pack()
def select_folder():
folder = filedialog.askdirectory()
if folder:
status_label.config(text="Обработка...")
threading.Thread(target=process_images, args=(folder, status_label), daemon=True).start()
tk.Button(root, text="Выбрать папку и начать", command=select_folder, padx=20, pady=10).pack()
root.mainloop()
if __name__ == "__main__":
main()

Думаю, что объяснять тут особо нечего. Набор допустимых расширений (типов файлов) можете изменить (дополнить) сами. Изменённые файлы сохраняются в той же папке, но с другими именами. Результат будет примерно такой:

-2

Да, если сильно захотеть, то можно сделать что-то и получше. Но это довольно узкая задача, и я лично не хочу тратить время на “красоту”. Свою миссию она выполняет - избавляет меня от рутинных операций и повышает мою производительность - а это и есть основной смысл любой автоматизации.

Экономия времени может показаться пустяковой - минут 5…10 в день. Но потратил я на создание этого скрипта наверно около часа. Так что окупятся эти трудозатраты за пару недель (максимум за месяц). Такой окупаемости, например, автоматизаторы производственных процессов могут только позавидовать - там окупаемость обычно исчисляется годами.

На этом всё. Подписывайтесь на канал, чтобы ничего не пропустить.