def create_image_sequence(images, fps=None, aspectRatio=None, resolution=None):
'''
Takes request.FILE images and makes video sequence it finnaly transfers to gif
DONT FORGET TO DELETE GIF
'''
#STORING IMAGES INTO TMP FOLDER
imagesTMPpaths = []
for key, value in images.items():
ext = photo_extension(value)
tmp_image = tempfile.NamedTemporaryFile(delete=False, suffix=ext)
tmp_image.write(io.BytesIO(value.read()).read())
tmp_image.close()
imagesTMPpaths.append(tmp_image.name)
print(f'{key}: {value}')
#GETTING SMALLEST WIDTH --------
images_sizes = []
for image_tmp_path in imagesTMPpaths:
with Image.open(image_tmp_path) as img:
width, height = img.size #returns duplets
images_sizes.append([width*height, width, height])
images_sizes.sort() #it automaticly sorts by its first value
print('xxxxxxx\nSize resizing to: ', images_sizes[0], '\nxxxxxxx')
#GETTING SMALLEST WIDTH end --------
#RESIZE IMAGES TO SMALLEST ONE --------
print('\nresizing proces\n-------')
for image_tmp_path in imagesTMPpaths:
#https://stackoverflow.com/a/4271003 (resize with black fillers/padding)
with Image.open(image_tmp_path) as img:
print('\noriginal size: ', img.size)
imgModified = ImageOps.pad(Image.open(image_tmp_path), (images_sizes[0][1], images_sizes[0][2]), color='black')
imgModified.save(image_tmp_path)
print('modified size: ', imgModified.size)
print('PASSED: ', imgModified.size == (images_sizes[0][1], images_sizes[0][2]), '\n')
# Verify all images have been resized correctly
for image_tmp_path in imagesTMPpaths:
with Image.open(image_tmp_path) as img:
img = Image.open(image_tmp_path)
print('size: ', img.size)
print('PASSED: ', img.size == (images_sizes[0][1], images_sizes[0][2]), '\n')
print(imagesTMPpaths)
print(type(fps))
print(f'fps: --{fps}--')
print(fps not in [None,''])
# Creating image sequence clip
if fps in [0, None, '']:
fps = len(imagesTMPpaths)
else:
fps = int(fps)
imageSequence = ImageSequenceClip(imagesTMPpaths, fps=fps)
if resolution not in [None,'no change']:
width, height = map(int, resolution.split('x')) #split will split around X and map makes two outputs int
print('Resolution allowed:', resolution)
print(width, height)
imageSequence = imageSequence.resize(newsize=(width, height))
print("Resolution updated. New size:", imageSequence.size)
# Adjust aspect ratio if specified
if aspectRatio not in [None,'no change']:
print('Aspect ratio allowed:', aspectRatio)
x, y = map(int, aspectRatio.split(':'))
imageSequence = imageSequence.resize(newsize=(imageSequence.size[0], int(imageSequence.size[0] * y / x)))
print("Aspect ratio updated. New size:", imageSequence.size)
#final GIF
tmp_gif = tempfile.NamedTemporaryFile(delete=False, suffix='.gif')
imageSequence.write_gif(tmp_gif.name, program = 'ffmpeg')#WRITING INTO --> tmp_gif, when using same tmp_gif path!
imageSequence.close()
tmp_gif.close()
for image_tmp_path in imagesTMPpaths:
os.remove(image_tmp_path)
return tmp_gif.name
Все работает нормально, пока не достигнет imageSequence = ImageSequenceClip(imagesTMPpaths, fps=fps)
даже после того, как я проверю в консоли, что изображения имеют одинаковую ширину и длину, они все еще составляет исключение.
Это вывод из консоли:
тогда возникает исключение: ImageSequenceClip требует, чтобы все изображения были одинакового размера.
Как вы видите в коде, я попытался изменить размер изображений до наименьшего размера. но с тем же соотношением, что и исходное изображение, поэтому я использовал это: imgModified = ImageOps.pad(Image.open(image_tmp_path), (images_sizes[0][1], images_sizes[0][2]), color='black')
и после этого я дважды проверил в консоли, верны ли размеры, и вывод с консоли показывает, что они такие же.
Я пытался стереть всю папку tmp в докере, но это не помогло. Я попробовал пересобрать весь контейнер, но это не помогло.
это моя функция [code]def create_image_sequence(images, fps=None, aspectRatio=None, resolution=None): ''' Takes request.FILE images and makes video sequence it finnaly transfers to gif
DONT FORGET TO DELETE GIF '''
#STORING IMAGES INTO TMP FOLDER imagesTMPpaths = []
for key, value in images.items(): ext = photo_extension(value)
images_sizes.sort() #it automaticly sorts by its first value print('xxxxxxx\nSize resizing to: ', images_sizes[0], '\nxxxxxxx')
#GETTING SMALLEST WIDTH end --------
#RESIZE IMAGES TO SMALLEST ONE -------- print('\nresizing proces\n-------') for image_tmp_path in imagesTMPpaths: #https://stackoverflow.com/a/4271003 (resize with black fillers/padding)
with Image.open(image_tmp_path) as img: print('\noriginal size: ', img.size)
# Verify all images have been resized correctly for image_tmp_path in imagesTMPpaths: with Image.open(image_tmp_path) as img: img = Image.open(image_tmp_path) print('size: ', img.size) print('PASSED: ', img.size == (images_sizes[0][1], images_sizes[0][2]), '\n')
print(imagesTMPpaths) print(type(fps)) print(f'fps: --{fps}--') print(fps not in [None,''])
# Creating image sequence clip if fps in [0, None, '']: fps = len(imagesTMPpaths) else: fps = int(fps)
if resolution not in [None,'no change']: width, height = map(int, resolution.split('x')) #split will split around X and map makes two outputs int print('Resolution allowed:', resolution) print(width, height) imageSequence = imageSequence.resize(newsize=(width, height)) print("Resolution updated. New size:", imageSequence.size)
# Adjust aspect ratio if specified if aspectRatio not in [None,'no change']: print('Aspect ratio allowed:', aspectRatio) x, y = map(int, aspectRatio.split(':'))
imageSequence = imageSequence.resize(newsize=(imageSequence.size[0], int(imageSequence.size[0] * y / x))) print("Aspect ratio updated. New size:", imageSequence.size)
imageSequence.write_gif(tmp_gif.name, program = 'ffmpeg')#WRITING INTO --> tmp_gif, when using same tmp_gif path! imageSequence.close()
tmp_gif.close()
for image_tmp_path in imagesTMPpaths: os.remove(image_tmp_path)
return tmp_gif.name [/code] Все работает нормально, пока не достигнет imageSequence = ImageSequenceClip(imagesTMPpaths, fps=fps) даже после того, как я проверю в консоли, что изображения имеют одинаковую ширину и длину, они все еще составляет исключение. Это вывод из консоли: [code]####-web-1 | 0: xddd.png ####-web-1 | 1: Candlera-7_c582e094-1714-43df-bc18-a56e8277bd91.webp ####-web-1 | xxxxxxx ####-web-1 | Size resizing to: (111, 194) ####-web-1 | xxxxxxx ####-web-1 | ####-web-1 | original size: (111, 194) ####-web-1 | modified size: (111, 194) ####-web-1 | PASSED: True ####-web-1 | ####-web-1 | ####-web-1 | original size: (700, 700) ####-web-1 | modified size: (111, 194) ####-web-1 | PASSED: True ####-web-1 | ####-web-1 | size: (111, 194) ####-web-1 | PASSED: True ####-web-1 | ####-web-1 | size: (111, 194) ####-web-1 | PASSED: True [/code] тогда возникает исключение: ImageSequenceClip требует, чтобы все изображения были одинакового размера. Как вы видите в коде, я попытался изменить размер изображений до наименьшего размера. но с тем же соотношением, что и исходное изображение, поэтому я использовал это: imgModified = ImageOps.pad(Image.open(image_tmp_path), (images_sizes[0][1], images_sizes[0][2]), color='black') и после этого я дважды проверил в консоли, верны ли размеры, и вывод с консоли показывает, что они такие же. Я пытался стереть всю папку tmp в докере, но это не помогло. Я попробовал пересобрать весь контейнер, но это не помогло.
У меня есть словарь input_dict={'foo1':3, 'foo2':6, и я хочу сохранить его содержимое в экземпляре класса matClass, например что mat.foo1=3, mat.foo2=6 и т. д.
Мне нужно автоматизировать этот процесс, поскольку размер словаря может меняться в...