使用MoviePy的ImageSequenceClip报错:图片尺寸一致仍触发尺寸异常
MoviePy ImageSequenceClip尺寸一致仍触发异常问题
在实现图片转GIF的函数时,已将所有上传图片调整为相同尺寸(通过ImageOps.pad补黑边到最小尺寸),控制台验证所有图片尺寸均为(111,194),但执行ImageSequenceClip(imagesTMPpaths, fps=fps)时仍抛出「ImageSequenceClip requires all images to be the same size」异常。
实现函数代码
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: #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
已尝试的操作
- 清理Docker临时文件夹
- 重建Docker容器
问题仍未解决,寻求解决方案。
内容的提问来源于stack exchange,提问作者Bruno Vontor
相关产品推荐
相关产品推荐

