Python

Python помогите правильнее написать код.

Функция CollageImage - два аргумента первое [1,2,3,4] названия фоток товаров(название сохранены по индексам т.е цифры), второе для кого сохраняется коллаж айди пользователя

Мне нужно чтобы функция определяла длину и создавала коллаж в любом количество хоть это будет 9 штук, фотки квадратные, значит если фоток 3, то 4 фоткой будет Image.open(f"Photo/WhiteNull.png")

ИНТЕРФЕЙС

если 1 фотка в массиве - 1 фотка

если 2 фотка в массиве - 2 фотки в ряд

если 3 фотка в массиве - 2 ряда и 2 столбца, 4 будет пустой белый

если 4 фотка в массиве - 2 ряда и 2 столбца

если 5 фотка в массиве - 3 ряда и 2 столбца, 6 будет пустой белый

если 6 фотка в массиве - 3 ряда и 2 столбца

если 7 фотка в массиве - 2 ряда и 4 столбца, 8 фоткой будет пустой белый

если 8 фотка в массиве - 2 ряда и 4 столбца

если 9 фотка в массиве - 3 ряда и 3 столбца

9 это максимум

______________

НА каждой фотке свой номер по добавлению 1, 2, 3, 4 , 5
 def CollageImage(IndexTovar, UserID): 
if len(IndexTovar) == 4 or len(IndexTovar) == 3:
font = ImageFont.truetype("Photo/Font/Samson.ttf", 50)
positionX = 20
positionY = 90
img1 = Image.open(f"Photo/{IndexTovar[0]}.png")
img2 = Image.open(f"Photo/{IndexTovar[1]}.png")
img3 = Image.open(f"Photo/{IndexTovar[2]}.png")
if len(IndexTovar) == 4:
img4 = Image.open(f"Photo/{IndexTovar[3]}.png")
else:
img4 = Image.open(f"Photo/WhiteNull.png")
# Ставка номеров на изображение
ImageDraw.Draw(img1).text((positionX, positionY), "1", font=font, fill='black', embedded_color=True)
ImageDraw.Draw(img2).text((positionX, positionY), "2", font=font, fill='black')
ImageDraw.Draw(img3).text((positionX, positionY), "3", font=font, fill='black')
if len(IndexTovar) == 4:
ImageDraw.Draw(img4).text((positionX, positionY), "4", font=font, fill='black')

img1_arr = np.array(img1)
img2_arr = np.array(img2)
img3_arr = np.array(img3)
img4_arr = np.array(img4)
Image.fromarray(np.vstack([np.hstack([img1_arr, img2_arr]), np.hstack([img3_arr, img4_arr])])).save(
f"Photo/UsersColage/{UserID}.png")

elif len(IndexTovar) == 2:
img1_arr = np.array(Image.open(f"Photo/{IndexTovar[0]}.png"))
img2_arr = np.array(Image.open(f"Photo/{IndexTovar[1]}.png"))
Image.fromarray(np.vstack([img1_arr, img2_arr])).save(
f"Photo/UsersColage/{UserID}.png")
elif len(IndexTovar) == 1:
Image.open(f"Photo/{IndexTovar[0]}.png").save(f"Photo/UsersColage/{UserID}.png")
else:
print(IndexTovar, "Ошибка колажа")
[ChatGPT] Вот исправленный код функции CollageImage, который удовлетворяет условиям интерфейса и автоматически определяет количество строк и столбцов в зависимости от количества фоток:
 import numpy as np 
from PIL import Image, ImageDraw, ImageFont

def CollageImage(IndexTovar, UserID):
font = ImageFont.truetype("Photo/Font/Samson.ttf", 50)
positionX = 20
positionY = 90

# определение количества строк и столбцов в зависимости от количества фоток
if len(IndexTovar) == 1:
rows, cols = 1, 1
elif len(IndexTovar) == 2:
rows, cols = 1, 2
elif len(IndexTovar) == 3:
rows, cols = 2, 2
elif len(IndexTovar) == 4:
rows, cols = 2, 2
elif len(IndexTovar) == 5:
rows, cols = 3, 2
elif len(IndexTovar) == 6:
rows, cols = 3, 2
elif len(IndexTovar) == 7:
rows, cols = 2, 4
elif len(IndexTovar) == 8:
rows, cols = 2, 4
elif len(IndexTovar) == 9:
rows, cols = 3, 3
else:
print(IndexTovar, "Ошибка колажа")
return

# создание пустой матрицы для коллажа
img_matrix = np.empty((rows, cols), dtype=object)

# заполнение матрицы фотками и их номерами
for i in range(rows):
for j in range(cols):
if i * cols + j < len(IndexTovar):
img_matrix[i][j] = Image.open(f"Photo/{IndexTovar[i*cols+j]}.png")
ImageDraw.Draw(img_matrix[i][j]).text((positionX, positionY), str(i*cols+j+1), font=font, fill='black')
else:
img_matrix[i][j] = Image.open("Photo/WhiteNull.png")

# конвертация матрицы в изображение и сохранение
img_arr = np.vstack([np.hstack([np.array(img) for img in row]) for row in img_matrix])
Image.fromarray(img_arr).save(f"Photo/UsersColage/{UserID}.png")
Здесь используется двумерный массив img_matrix, в котором хранятся фотки товаров и их номера. Сначала определяется количество строк и столбцов для матрицы, затем создаётся пустая матрица нужного размера, которая заполняется фотками и номерами. После этого матрица конвертируется в изображение и сохраняется.
Марат Саубанов
Марат Саубанов
3 116
Лучший ответ
это жесть
строчка out = "counts = 3"
всегда будет выводить
counts = 3"
дай нормальное условие задачи
ну дам тебе массив
что ты от него хочешь???
Роман Власов Это не код, а выполнение программы должно быть таким, если бы у меня получалось бы написать этот код, я бы не просил помощи, не надо мне от тебя помощи, уйди просто пропусти если не знаешь