J'ai essayé de produire une animation GIF pour LGTM avec un script à partir de vidéos et de photos prises en voyage. Réduisez magnifiquement les photos avec l'anti-aliasing Ceci est une suite de l'article. Le tremblement de la caméra est plus grave que prévu, je voudrais donc ajouter une logique de correction du tremblement de la caméra comme objectif futur. Vous devriez pouvoir le faire en extrayant les points caractéristiques de l'image et le motif correspondant ...
Confirmé pour fonctionner uniquement dans l'environnement python2.7 de mac
#Installation de PIL
pip install PIL --allow-external PIL --allow-unverified PIL
#installation d'imagemagick
brew install imagemagick
#confirmation d'installation
convert --version
>>> Version: ImageMagick 6.9.2-5 Q16 x86_64 2015-11-01 http://www.imagemagick.org
>>> Copyright: Copyright (C) 1999-2015 ImageMagick Studio LLC
>>> License: http://www.imagemagick.org/script/license.php
>>> Features: Cipher DPC Modules
>>> Delegates (built-in): bzlib freetype jng jpeg ltdl lzma png tiff xml zlib
#Installation de ffmpeg
brew install ffmpeg
lgtm.py
# -*- coding: utf-8 -*-
import commands
import Image
import re
#Pixels de hauteur d'image lors de la réduction
PHOTO_HEIGHT = 300
#Dossier avec images
BASE_DIR = "/Users/XXXX/Desktop/Photos"
#Nom d'expression régulière de l'image
PHOTO_REGEX = r"P.*.[jpg|JPG]"
#Préfixe d'image après redimensionnement
PHOTO_RESIZE_PREFIX = "r_"
#Image LGTM
LGTM_PATH = "/tmp/lgtm.png "
#Coordonnées pour la composition d'images LGTM
LGTM_PASTE_X_Y = (120, 0)
def main():
#Obtenir le chemin complet de l'image
_cmd = "cd {} && ls".format(BASE_DIR)
l = commands.getoutput(_cmd)
l = l.split("\n")
l = [_l for _l in l if re.match(PHOTO_REGEX, _l)]
#Générer un dossier pour la sortie
assert len(BASE_DIR) > 5, "BASE_DIR is too short"
commands.getoutput("rm -rf {}/output".format(BASE_DIR))
commands.getoutput("mkdir {}/output".format(BASE_DIR))
for _l in l:
before_path = '{}/{}'.format(BASE_DIR, _l)
filename = '{}{}'.format(PHOTO_RESIZE_PREFIX, _l)
after_path = '{}/output/{}'.format(BASE_DIR, filename)
resize(before_path, after_path, filename=_l) #Rétrécir
def resize(before, after, height=PHOTO_HEIGHT, filename="", aa_enable=True, lgtm_enable=True):
"""
Redimensionner l'image
:param str before:Chemin du fichier image d'origine
:param str after:Chemin du fichier image après le redimensionnement
:param int height:Hauteur de l'image après le redimensionnement
:param bool aa_enable:Activer l'anticrénelage
:param bool lgtm_enable:Activer ou non la composition d'images LGTM
:return:
"""
#Ouvrir l'image en lecture seule
img = Image.open(before, 'r')
#Calculer les pixels de l'image après le redimensionnement
before_x, before_y = img.size[0], img.size[1]
x = int(round(float(height / float(before_y) * float(before_x))))
y = height
resize_img = img
if aa_enable:
#Rétrécir avec l'anticrénelage
resize_img.thumbnail((x, y), Image.ANTIALIAS)
else:
#Rétrécir sans antialiasing
resize_img = resize_img.resize((x, y))
#composition d'image lgtm
if lgtm_enable:
lgtm = Image.open(LGTM_PATH)
resize_img.paste(lgtm, LGTM_PASTE_X_Y, lgtm) #Je synthétise en faisant correspondre les coordonnées
#Enregistrer l'image après le redimensionnement
resize_img.save(after, 'jpeg', quality=100)
print "RESIZED!:{}[{}x{}] --> {}x{}".format(filename, before_x, before_y, x, y)
#Courir
main()
#génération d'animation gif
cmd = "convert -layers optimize -loop 0 -delay 60 {}/output/*.* {}/lgtm.gif".format(BASE_DIR, BASE_DIR)
output = commands.getoutput(cmd)
print output
Résultat d'exécution
>>>python ./lgtm.py
RESIZED!:P1050400.JPG[4592x3448] --> 400x300
RESIZED!:P1050401.JPG[4592x3448] --> 400x300
RESIZED!:P1050402.JPG[4592x3448] --> 400x300
RESIZED!:P1050403.JPG[4592x3448] --> 400x300
RESIZED!:P1050404.JPG[4592x3448] --> 400x300
RESIZED!:P1050405.JPG[4592x3448] --> 400x300
RESIZED!:P1050406.JPG[4592x3448] --> 400x300
sample
$ ffmpeg -i [INPUT_FILE] -f image2 -vcodec png -r 4 "./%03d.png "
-je fichier d'entrée
-format f
-codec vcodec
-r Nombre d'images par seconde
%03d numéro à 3 chiffres
Celui que j'utilise souvent avec ffmpeg
Recommended Posts