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