Tenho uma série de imagens das quais quero criar um vídeo. Idealmente, eu poderia especificar uma duração de quadro para cada quadro, mas uma taxa de quadros fixa também seria boa. Estou fazendo isso no wxPython, para poder renderizar em um wxDC ou salvar as imagens em arquivos, como PNG. Existe uma biblioteca Python que me permita criar um vídeo (AVI, MPG, etc) ou um GIF animado a partir desses quadros?
Edit: Eu já tentei PIL e parece não funcionar. Alguém pode me corrigir com esta conclusão ou sugerir outro kit de ferramentas? Este link parece apoiar minha conclusão sobre o PIL: http://www.somethinkodd.com/oddthinking/2005/12/06/python-imaging-library-pil-and-animated-gifs/
fonte
imageio in anaconda
produzTrue
, yay!Bem, agora estou usando o ImageMagick. Salvei meus quadros como arquivos PNG e invoco o convert.exe do ImageMagick do Python para criar um GIF animado. O bom dessa abordagem é que posso especificar uma duração de quadro para cada quadro individualmente. Infelizmente, isso depende do ImageMagick ser instalado na máquina. Eles têm um wrapper Python, mas parece muito ruim e sem suporte. Ainda aberto a outras sugestões.
fonte
convert -delay 20 -loop 0 *jpg animated.gif
convert -delay 20 -resize 300x200 -loop 0 *jpg animated.gif
Em junho de 2009, a postagem do blog originalmente citada tinha um método para criar GIFs animados nos comentários . Faça o download do script images2gif.py (anteriormente images2gif.py , atualização cortesia de @geographika).
Em seguida, para reverter os quadros em um gif, por exemplo:
fonte
pip install visvis
, por exemplo , em seu scriptfrom visvis.vvmovie.images2gif import writeGif
.Veja como você faz isso usando apenas PIL (instale com :)
pip install Pillow
:fonte
x = [a, b, c]
para*x
o que pode ser pensado comoa, b, c
(sem os colchetes encerram). Em chamadas de função são sinônimos:f(*x) == f(a, b, c)
. Na descompactação da tupla, é particularmente útil nos casos em que você deseja dividir um iterável em uma cabeça (primeiro elemento) e uma cauda (o resto), que é o que faço neste exemplo.Eu usei o images2gif.py, que era fácil de usar. Parecia dobrar o tamanho do arquivo.
26 arquivos PNG de 110kb, eu esperava 26 * 110kb = 2860kb, mas my_gif.GIF tinha 5,7mb
Também porque o GIF tinha 8 bits, os belos png ficaram um pouco confusos no GIF
Aqui está o código que eu usei:
Aqui estão 3 dos 26 quadros:
encolher as imagens reduziu o tamanho:
fonte
fp.write(globalPalette) TypeError: must be string or buffer, not list
Para criar um vídeo, você pode usar opencv ,
fonte
Me deparei com este post e nenhuma das soluções funcionou, então aqui está a minha solução que funciona
Problemas com outras soluções até agora:
1) Nenhuma solução explícita sobre como a duração é modificada
2) Nenhuma solução para a iteração de diretório fora de ordem, essencial para GIFs
3) Nenhuma explicação sobre como instalar o imageio para python 3
instale o imageio como este: python3 -m pip install imageio
Nota: convém garantir que seus quadros tenham algum tipo de índice no nome do arquivo para que possam ser classificados, caso contrário, você não terá como saber onde o GIF começa ou termina
fonte
sort
poderá gerar resultados inesperados se o seu esquema de numeração não incluir zeros à esquerda. Além disso, por que você usou o mapa em vez de uma simples compreensão de lista?filenames.append(os.path.join(path, filename))
images = [imageio.imread(f) for f in filenames]
é mais limpa, mais rápida e mais pitônica.Como Warren disse no ano passado , esta é uma pergunta antiga. Como as pessoas ainda parecem estar visualizando a página, eu gostaria de redirecioná-las para uma solução mais moderna. Como blakev disse aqui , há um exemplo de travesseiro no github .
Nota: Este exemplo está desatualizado (
gifmaker
não é um módulo importável, apenas um script). Pillow possui um GifImagePlugin (cuja fonte está no GitHub ), mas o documento no ImageSequence parece indicar suporte limitado (somente leitura)fonte
Não é uma biblioteca python, mas o mencoder pode fazer isso: Codificação de vários arquivos de imagem de entrada . Você pode executar o mencoder a partir do python assim:
fonte
Pergunta antiga, muitas boas respostas, mas ainda pode haver interesse em outra alternativa ...
O
numpngw
módulo que eu instalei recentemente no github ( https://github.com/WarrenWeckesser/numpngw ) pode gravar arquivos PNG animados a partir de matrizes numpy. ( Atualização :numpngw
agora está em pypi: https://pypi.python.org/pypi/numpngw .)Por exemplo, este script:
cria:
Você precisará de um navegador que suporte PNG animado (diretamente ou com um plug-in) para ver a animação.
fonte
Como um membro mencionado acima, o imageio é uma ótima maneira de fazer isso. O imageio também permite que você defina a taxa de quadros, e na verdade escrevi uma função em Python que permite que você defina o quadro final. Eu uso essa função para animações científicas em que o loop é útil, mas o reinício imediato não é. Aqui está o link e a função:
Como criar um GIF usando Python
fonte
Você já experimentou o PyMedia ? Não tenho 100% de certeza, mas parece que este exemplo de tutorial está direcionado ao seu problema.
fonte
No windows7, python2.7, opencv 3.0, o seguinte funciona para mim:
fonte
A coisa mais fácil que faz funcionar para mim é chamar um comando de shell no Python.
Se suas imagens estiverem armazenadas como dummy_image_1.png, dummy_image_2.png ... dummy_image_N.png, você poderá usar a função:
Basta executar:
Isso criará seu arquivo gif my_output.gif.
fonte
A tarefa pode ser concluída executando o script python de duas linhas da mesma pasta que a sequência dos arquivos de imagem. Para arquivos formatados em png, o script é -
fonte
Eu estava procurando por um código de linha única e achei o seguinte para o meu aplicativo. Aqui está o que eu fiz:
Primeiro passo: Instale o ImageMagick no link abaixo
https://www.imagemagick.org/script/download.php
Segundo passo: aponte a linha de cmd para a pasta onde as imagens (no meu caso, no formato .png) são colocadas
Terceiro passo: Digite o seguinte comando
Obrigado FogleBird pela ideia!
fonte
Eu apenas tentei o seguinte e foi muito útil:
Primeiro Baixe as bibliotecas
Figtodat
eimages2gif
para o diretório local.Em segundo lugar, colete as figuras em uma matriz e converta-as em um gif animado:
fonte
Encontrei o módulo ImageSequence da PIL , que oferece uma melhor informação GIF (e mais padrão). Eu também uso o método after () da Tk dessa vez, o que é melhor que o time.sleep () .
fonte
Uma função simples que cria GIFs:
fonte
Entendo que você perguntou sobre a conversão de imagens em um gif; no entanto, se o formato original for MP4, você poderá usar o FFmpeg :
fonte
É realmente incrível ... Todos estão propondo um pacote especial para reproduzir um GIF animado, no momento em que isso pode ser feito com o Tkinter e o módulo PIL clássico!
Aqui está o meu próprio método de animação GIF (eu criei há um tempo). Muito simples:
Você pode definir seus próprios meios para interromper a animação. Deixe-me saber se você deseja obter a versão completa com os botões reproduzir / pausar / sair.
Nota: Não tenho certeza se os quadros consecutivos são lidos da memória ou do arquivo (disco). No segundo caso, seria mais eficiente se todos lessem de uma vez e salvos em uma matriz (lista). (Não estou tão interessado em descobrir! :)
fonte
sleep
o thread principal de uma GUI. Você pode usar oafter
método para chamar uma função periodicamente.tk.after()
mim mesmo. Mas aqui eu precisava tornar o código o mais simples possível. Quem usa esse método de animação GIF pode aplicar sua própria função de atraso.