HDRShop supporte une architecture d'implémentation de plugins
très flexible qui permet à un utilisateur d'écrire un
nouveau type de traitement d'image et de l'intégrer dans l'interface
de HDRshop. Les Plug-ins sont de petits programmes spéciaux fonctionnant
par lignes de commandes et indépendants ; ils reçoivent leurs
paramètres via des arguments qu'on leur passe par lignes de commandes.
En raison de cette structure particulière, càd un interfaçage
avec HDRShop qui s'effectue par passage d'arguments en lignes de commandes
et utilisation des canaux standard, un plugin peut être écrit
dans n'importe quel language et effectuer tout type de traitements sur une
image, Pour ce didacticiel, nous présumons que le language choisit
est le C++.
Nous allons illustrer la façon d'écrire un plugin avec un exemple simple : un plug-in qui blur(brouille) une image et qui optionnellement réduit aussi sa taille de moitié.
Le plug-in communique avec HDRshop via le 'stream'(courant) stdin. Quand le plugin est appellé avec un unique argument en ligne de commande "--help" ou "/?" il doit envoyer en sortie sa liste de paramètres dans un format spécifique et quitter. Notre plug-in va envoyer le message suivant vers stderr :
Ceci est un simple plugin de test qui brouille une image.
HDRSHOPFLAGS:
HDRSHOPVERSION: 1.0.1
USAGE: sample_plugin [input.pfm] [output.pfm] [options]
OPTIONS:
/V:[int=10] Blur Variance
/D Downsample 50%
Le plugin doit lister les informations le concernant dans les blocks suivants:
Les descripteurs de paramètres
sont inscrit entre crochets: [], sauf pour les sélections multiple,
qui sont inscrites entre accolade: {}. A l'intérieur des crochets
figure le type de descripteur, suivit par une valeur par défaut optionnelle.
Si une valeur par défaut est spécifié, alors HDRShop
va initialiser l'interface Utilisateur générée par les
options à cette valeur. Les types de descripteurs de paramètres
disponibles sont :
Type | Descripteur | Défaut | Exemple(identifiant + descripteur) | Notes |
boolean | false | /downsample | Si cette option est présente en ligne de commande, la valeur est vrai, autrement elle est fausse. | |
integer | [integer=X],[int=X] | X | --iterations=[int=6] | |
string | [string=X],[str=X] | X | /greeting:[string=Hello World!] | |
float | [float=X] | X | /pi=[float] | Dans tous les cas, si l'utilisateur ne donne aucune valeur pour une option, Cette option n'est pas envoyée comme argument en ligne de commande. |
nom de fichier en Entrée |
[inputfilename=X] | X | /C:[inputfilename=my default.cfg] | Indique un fichier qui sera lu par le plugin |
nom de fichier en Sortie |
[outputfilename=X] | X | /debugout=[outputfilename=debug.txt] | Indique un fichier qui sera écrit par le plugin |
rectangle | [selection] | See notes | /s[selection] | L'interface Utilisateur pour cette option est une boite de contrôle, par défaut coché. Si coché, la sélection courante dans HDRShop sera envoyée au plugin, Au format: 100,100,200,200 (Ceci pour : Haut,Gauche,Bas,Droite). Si il n'y a pas de sélection, la taille de l'image entière est retournée. |
Choix multiple |
{String1|String2|...|StringN} | String1 | --algorithm:{|fast|accurate|weird} | Sélection multiple à partir de la liste de chaînes donnée. La première valeur est celle par défaut. |
Quand le plugin est sélectionné par l'utilisateur, HDRShop va éxecuter "sample_plugin --help" et analyse le texte résultant. HDRShop va créer un boite de dialogue où l'utilisateur va pouvoir entrer des valeurs pour toutes les options du plugin. Quand l'utilisateur a sélectionné les options et clique "Execute", HDRShop va appeller le plugin à nouveau, cette fois avec toutes les options emballées en tant qu'arguments en ligne de commande. Les options sont passées au plugin dans le même format que spécifié ci-dessus. Par exemple, si l'utilisateur sélectionne une valeur de 15 pour l'option "Blur Variance", HDRShop va passer l'argument en ligne de commande suivant : /V:15. Si l'utilisateur a sélectionné l'option "Downsample", HDRShop va passer l'argument /D, autrement il va laisser l'argument désactivé.
Pour les plugins qui manipulent des images, HDRShop les passe au format .pfm . Voir ci-dessous pour les détails sur la façon d'analyser ces fichiers. HDRShop écrit l'image courante dans un fichier .pfm temporaire, qu'il passe au plugin. Si le plug-in est supposé renvoyer une image à HDRShop, HDRShop indique le nom du fichier temporaire dans lequel le plugin devrait sauvegarder le fichier .pfm.
Maintenant regardons le véritable code source pour le plugin:
int main(int argc, char *argv[])
{
char *inputfilename = 0;
char *outputfilename = 0;
int downsample = 0;
int variance = 10;
if (argc == 1) {
printHelp();
exit(0);
}
for (x = 1; x < argc; x++) {
if (argv[x][0] == '-') {
if (argv[x][1] == '-') {
if (strncmp("help", &argv[x][2], 4) == 0) {
printHelp();
exit(0);
}
}
}
else if (argv[x][0] == '/') {
switch(argv[x][1]) {
case '?':
printHelp();
exit(0);
break;
case 'V':
variance = atoi(argv[x]+3);
break;
case 'D':
downsample = 1;
break;
}
}
else {
if (inputfilename == 0)
inputfilename = argv[x];
else
outputfilename = argv[x];
}
}
...
Cette section analyse les arguments en lignes de commande. Si on passe au programme /? ou --help, il appelle printHelp() qui imprime le message détaillé ci-dessus vers stderr puis sort des lignes de commande. Autrement, le programme cherche le premier repère "barre oblique de devant" pour indiquer les options de ligne de commande. Si l'option est ?, il imprime le message d'aide. Autrement, si l'option est V, il analyse la partie restante de la chaîne pour trouver la valeur sous forme d'entier de la Variance. Si l'option est D, il fixe le repère de downsample à vrai. Finalement, si l'argument en ligne de commande n'est pas une option, il est considéré comme étant le nom du fichier à prendre en Entrée. Si le nom du fichier à prendre en Entrée a déjà été lu, l'argument rencontré est alors supposé être le nom du fichier à inscrire en sortie.
if (!inputfilename)La fonction doError() imprime juste une chaîne d'erreur vers stderr et ensuite appelle exit() avec une valeur différente de zéro pour indiquer à HDRshop qu'une erreur est survenue. HDRshop va afficher tout ce qui a été sortie vers stderr vers l'utilisateur sous forme de message d'erreur. La class "floatimage" est une class utility. Elle fournit un certain nombre de fonctions utiles comme file(fichier) i/o à partir de formats variés, lectures des pixels antialiasés, bluring(brouillage), convolution(enroulement), et autres utilitaires. Le code source complet pour floatimage et ce plug-in d'exemple sont disponible au téléchargement ici .
doError(1);
if (!outputfilename)
doError(2);
floatimage fimg;
if (!fimg.LoadPFM(inputfilename))
doError(3);
fimg.fast_gaussian_blur(variance);
if (downsample)
fimg.halfsize();
if (!fimg.SavePFM(outputfilename))
doError(4);
return 0;
}
Une fois le plug-in compilé en un éxécutable qui
fonctionne, il doit être placé dans le sous-répertoire
appellé "plugins" lequel se trouve dans le même répertoire
que l'éxécutable HDRShop. Le nom du plug-in va apparaître
dans le Menu "Plugins" qui se trouve dans la barre de menu de la fenêtre
principale.
Retour aux didacticiels