Палочка создает пустой кадр и нерегулярную частоту кадров - PullRequest
0 голосов
/ 17 мая 2018

У меня есть фрагмент ниже, который создает GIF.Этот фрагмент взят из подсказок здесь .Фрагмент создает пустой кадр, и кадры имеют неравномерную задержку между ними.Обратите внимание на задержку между небытием и первым кадром, а затем быстро появляется второй кадр.Почему это происходит?

Мне пришлось создать изображение определенного размера перед рукой, потому что палочка не изменяет размер холста в соответствии с последовательностью максимального размера.Я должен найти способ разобраться и с этим.

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 : у меня есть другая проблема с похожим фрагментом здесь , не путать с этой проблемой.

Обновление 1:
Ниже приведен вывод, если я создаю объект палочки без предопределенного размера.Анимация выглядит нормально, но холст имеет первую последовательность (которая меньше), поэтому конечный gif обрезается, теперь полностью отображается вторая последовательность.
image

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

Обновление 2:
Ниже приведен вывод, если с указанным выше изменением я также передаю последовательность в обратном порядке, так что теперь жезл принял бы 1-й размер последовательности.Теперь конечный размер 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 кадра данных в проблеме выше))

desired_output

1 Ответ

0 голосов
/ 17 мая 2018

Согласно подсказкам, приведенным в решении здесь , я придумал приведенный ниже модифицированный фрагмент, который, похоже, решил проблему.Очевидно, мое требование требует 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
...