Cet été, j'ai été amené à travailler sur la partie technique d'un court métrage en stopmotion.
Il existe des solutions libres orientées animation tel que stopmotion ou luciole permettant de prendre les photos une à une en maitrisant un décor.
Dans mon cas les images ont été prises sur le terrain et je n'y étais pas. Les sujets étaient des humains qu'il fallait prendre en situation de travail. Ce ne sont ni des modèles ni des comédiens. Il était donc hors de question de leur faire perdre leur temps à poser pendant des heures.
J'ai eu besoin d'un système simple car je travaillais dans l'urgence pour renommer, recadrer et assembler toutes les photos.
Pour renommer, j'ai utilisé PyRenamer (source) qui permet, entre autre, de renommer des fichiers par lot avec numérotation automatique, justement ce dont j'avais besoin.
Pour recadrer, j'ai utilisé Mogrify un outil de la suite ImageMagick pour manipuler des images en ligne de commande.
Voici un exemple pour redimentionner tous les fichiers jpeg du répertoire courant en format full HD (1920x1080)
mogrify -path . -resize 1920x1080 -quality 97 -format jpg *.jpg
Pour assembler les photos en une vidéo, j'ai utilisé MEncoder un outil de la suite MPlayer pour encoder des vidéos.
Voici un exemple pour générer une vidéo HD à 5 image par seconde en utilisant tous les fichiers jpeg du répertoire courant
mencoder mf://*.jpg -mf w=1620:h=1080:type=jpeg:fps=5 -ovc copy -oac copy -o output.avi
Enfin, j'ai utilisé KDEnLive pour ajouter de la musique et monter tout ça.
Le but est d'autoriser l'utilisateur à écrire un modificateur pour modifier une date. Cela permet d'être plus dynamique.
Un modificateur se compose de 3 parties :
- Type d'opération sous la forme + ou -
- Valeur à appliquer
- Partie de la date à modifier sous la forme d pour jour, w pour semaine, m pour mois et y pour année
La fonction se présente sous la forme :
CREATE FUNCTION [dbo].[ApplyDateModifier]
(
@date varchar(32),
@modifier varchar(32)
)
RETURNS varchar(32)
AS
BEGIN
declare @return varchar(32),
@type char
set @return=@date
set @type=(substring(reverse(Lower(@modifier)),1,1))
if (@type='y')
begin
set @return=dbo.FormatDate(DATEADD(YEAR, convert(int,replace(@modifier,@type,'')),@date) ,'yyyymmdd')
end
if (@type='m')
begin
set @return=dbo.FormatDate(DATEADD(MONTH, convert(int,replace(@modifier,@type,'')),@date) ,'yyyymmdd')
end
if (@type='w')
begin
set @return=dbo.FormatDate(DATEADD(WEEK, convert(int,replace(@modifier,@type,'')),@date) ,'yyyymmdd')
end
if (@type='d')
begin
set @return=dbo.FormatDate(DATEADD(DAY, convert(int,replace(@modifier,@type,'')),@date) ,'yyyymmdd')
end
return @return
END
On utilise ici la fonction système DateAdd et la fonction vue précédemment FormatDate.
Exemple d'utilisation
select dbo.ApplyDateModifier(GetDate(),'3d');
Cela affichera la date du jour + 3 jours
La limite de cette fonction est qu'elle ne peut mélanger plusieurs partie à modifier.
Il m'est souvent utile de devoir formater une date.
Pendant longtemps j'ai utilisé ça :
Declare @Date SmallDatetime
set @Date = GetDate()
print Right('00' + convert(varchar,DatePart(Day, @Date),2) +
'/' +
Right('00' + convert(varchar,DatePart(Month, @Date),2) +
'/' +
Convert(varchar, DatePart(Year,@Date)
Cette solution, loin d'être élégante, a de nombreux défauts.
Elle n'est pas lisible.
Elle n'accepte qu'un seul format. Si le format change je dois changer toute la formule.
Elle s'utilise en copier/coller et est donc source d'erreur.
Pour tous ces points, j'ai créé une fonction qui prend en paramètre une date et un format et qui retourne cette date formaté.
CREATE FUNCTION [dbo].[FormatDate]
(
@date smalldatetime,
@format nvarchar(30)
)
RETURNS nvarchar(30)
AS
BEGIN
declare @nbAnnee int,
@nbMois int,
@nbJour int,
@Annee varchar(4),
@Mois varchar(2),
@Jour varchar(2),
@separator varchar(1),
@index int,
@character char,
@InsertAnnee bit,
@InsertMois bit,
@InsertJour bit,
@dateOutput varchar(30)
set @nbAnnee = 0
set @nbMois = 0
set @nbJour = 0
set @separator = ''
set @index = 1
set @dateOutput = ''
set @InsertAnnee = 0
set @InsertMois = 0
set @InsertJour = 0
while (@index<=len(@format))
begin
set @character = substring(@format,@index,1)
if (@character = 'Y')
begin
set @nbAnnee=@nbAnnee+1
end
else
begin
if (@character = 'M')
begin
set @nbMois=@nbMois+1
end
else
begin
if (@character = 'D')
begin
set @nbJour=@nbJour+1
end
else
begin
set @separator = @character
end
end
end
set @index = @index +1
end
set @Annee = Right('0000' + Convert(varchar,Year(@date)),@NbAnnee)
set @Mois = Right('00' + Convert(varchar,Month(@date)),@NbMois)
set @Jour = Right('00' + Convert(varchar,Day(@date)), @NbJour)
set @index = 1
while (@index=@index)
begin
set @character = substring(@format,@index,1)
if (@character='Y')
begin
if (@InsertAnnee = 0)
begin
set @dateOutput = @dateOutput + @Annee
set @InsertAnnee = 1
end
end
else
begin
if (@character='M')
begin
if (@InsertMois = 0)
begin
set @dateOutput = @dateOutput + @Mois
set @InsertMois = 1
end
end
else
begin
if (@character='D')
begin
if (@InsertJour = 0)
begin
set @dateOutput = @dateOutput + @Jour
set @InsertJour = 1
end
end
else
begin
set @dateOutput = @dateOutput + @separator
end
end
end
if (@InsertAnnee = 1) and (@InsertMois = 1) and (@InsertJour = 1)
begin
break
end
set @index = @index +1
end
return @dateOutput
END
Cette fonction réalise son traitement en plusieurs étapes.
1ere étape : elle récupère le nombre de caractères demandé pour chaque type (Jour, Mois, Année)
2e étape : elle formate chaque type suivant la 1ere étape
3e étape : elle position chaque type et séparateur suivant le chaine de formatage passé en paramètre
Voici un exemple d'utilisation
select dbo.FormatDate(GetDate(),'dd/mm/yyyy')
A noter qu'à partir de SQL Server 2014, il existe la commande Format.
select format(GetDate(),'d','fr-fr')