ImageSequenceClip из библиотеки Moviepy дает мне исключение: ImageSequenceClip требует, чтобы все изображения были одинаPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 ImageSequenceClip из библиотеки Moviepy дает мне исключение: ImageSequenceClip требует, чтобы все изображения были одина

Сообщение Anonymous »

это моя функция

Код: Выделить всё

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)
даже после того, как я проверю в консоли, что изображения имеют одинаковую ширину и длину, они все еще составляет исключение.
Это вывод из консоли:

Код: Выделить всё

####-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
тогда возникает исключение: ImageSequenceClip требует, чтобы все изображения были одинакового размера.
Как вы видите в коде, я попытался изменить размер изображений до наименьшего размера. но с тем же соотношением, что и исходное изображение, поэтому я использовал это: imgModified = ImageOps.pad(Image.open(image_tmp_path), (images_sizes[0][1], images_sizes[0][2]), color='black')
и после этого я дважды проверил в консоли, верны ли размеры, и вывод с консоли показывает, что они такие же.
Я пытался стереть всю папку tmp в докере, но это не помогло. Я попробовал пересобрать весь контейнер, но это не помогло.

Подробнее здесь: https://stackoverflow.com/questions/786 ... ceclip-req
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»