Wand创建空框架和不规则帧速率

时间:2018-05-17 12:02:08

标签: python imagemagick wand

我在下面的代码片段中创建了一个gif。此代码段源自提示here。该片段创建一个空框架,框架之间有不规则的延迟。注意在虚暗和第一帧之间的延迟,然后快速出现第二帧。为什么会这样?

我必须事先创建特定尺寸的图像,因为魔杖没有根据最大尺寸序列调整画布大小。我必须找到一种方法来解决这个问题。

def render(self):

        # map anim gif
        wand = Image2(width=205,height=223)

        #create frames
        for each_frame in self._tree_dot_frames:
            img = Image2(blob=each_frame)
            print('Image width: {} height: {}'.format(img.width,img.height))
            wand.sequence.append(img)

        #set frame rate
        for cursor in range(len(self._tree_dot_frames)):
            with wand.sequence[cursor] as frame:
                print('sequence width: {} height: {}'.format(frame.width,frame.height))
                frame.delay = 100

        #wand.merge_layers('merge')
        wand.format = 'gif'
        wand.save(filename='animated.gif')
        print('No of frames: {} gif width: {} height: {}'.format(len(wand.sequence),wand.width,wand.height))
        self._tree_dot_blob = wand.make_blob()

        return self._tree_dot_blob

输出:
图像宽度:175高度:136
图像宽度:205高度:223
序列宽度:205高度:223
序列宽度:175高度:136
帧数:3 gif宽度:205高度:223
img

PS :我有类似代码段here的其他问题,不要与此问题混淆。

更新1:
如果我创建没有预定义大小的wand对象,下面是输出。动画似乎没问题,但画布是第一个序列(更小),因此最终的gif被裁剪,现在完全显示第二个序列。
image

    #wand = Image2(width=205,height=223) 
    wand = Image2()

更新2:
下面是输出如果有上述变化,我也反过来输入序列,这样现在魔杖将采用第一个序列大小。现在最终的gif尺寸还可以,但正如你所看到的,更大的框架始终保持在背景中,这是现在的新问题。
image

    #create frames
    for each_frame in reversed(self._tree_dot_frames):
        img = Image2(blob=each_frame)
        print('Image width: {} height: {}'.format(img.width,img.height))
        wand.sequence.append(img)

请帮忙,因为如果按照以上任何方向行事我会陷入困境。

所需的解决方案将采用最大尺寸的馈送帧,并适应该尺寸的所有帧/类似下面应该做的事情(我在上面的问题中只显示了前2帧数据)< / p>

desired_output

1 个答案:

答案 0 :(得分:0)

根据解决方案here中给出的提示,我提出了以下修改后的代码段,似乎解决了这个问题。显然,我的要求需要MagickSetImageDisposeMagickExtentImage尚未在魔杖中实现。我非常感谢emcconville提供这方面的帮助,并要求他在下面的解决方案中添加他的评论。我还在探索。如果有任何关于这个问题的进一步问题,我会回来。

def render(self):

    wand = Image2()        

    #get max frame height, width
    frameSizeList = []
    tempImgList = []
    for each_frame in self._tree_dot_frames:
        img = Image2(blob=each_frame)
        frameSizeList.append((img.width,img.height))
        tempImgList.append(img)
    optimalFrameSize = (max(frameSizeList,key=itemgetter(1)))
    #print('Max Frame size detected: ',optimalFrameSize)

    #create frames
    for each_frame in tempImgList:
        newImg = Image2(width=optimalFrameSize[0], height=optimalFrameSize[1], background=Color('WHITE'))
        newImg.composite(each_frame,0,0)
        wand.sequence.append(newImg)

    #set frame rate
    for cursor in range(len(self._tree_dot_frames)):
        with wand.sequence[cursor] as frame:
            print('sequence width: {} height: {}'.format(frame.width,frame.height))
            frame.delay = 100

    #wand.merge_layers('merge')
    wand.format = 'gif'
    wand.save(filename='animated.gif')
    print('No of frames: {} gif width: {} height: {}'.format(len(wand.sequence),wand.width,wand.height))
    self._tree_dot_blob = wand.make_blob()

    return self._tree_dot_blob