我在下面的代码片段中创建了一个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
PS :我有类似代码段here的其他问题,不要与此问题混淆。
更新1:
如果我创建没有预定义大小的wand对象,下面是输出。动画似乎没问题,但画布是第一个序列(更小),因此最终的gif被裁剪,现在完全显示第二个序列。
#wand = Image2(width=205,height=223)
wand = Image2()
更新2:
下面是输出如果有上述变化,我也反过来输入序列,这样现在魔杖将采用第一个序列大小。现在最终的gif尺寸还可以,但正如你所看到的,更大的框架始终保持在背景中,这是现在的新问题。
#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>
答案 0 :(得分:0)
根据解决方案here中给出的提示,我提出了以下修改后的代码段,似乎解决了这个问题。显然,我的要求需要MagickSetImageDispose
或MagickExtentImage
尚未在魔杖中实现。我非常感谢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