You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 21:37:04