Outil pour traîter les dimensions d’images
Sommaire
Introduction
Le traîtement décrit ci-après permet d’obtenir les données automatiquement utilisables pour insérer les dimensions des images affichées dans une page web.
Voir, dans la page de documentation générale, la section Insertion des dimensions des images [http://www.dg77.net/tekno/sitedoc.htm#dim].
Le traîtement présenté ici permet de dresser, sous forme de fichier xml, une liste des images avec leurs dimensions, en vue de leur ajout automatique dans les balises img lors de la création des pages html finales.
Étape 1 : dresser la liste des images
Utilisation d’une transformation XSL.
:: Parametre : source XML :: exemples : :: bin\list_img galerie.xml set RSRC=XML\SRC set TMP=tmp md %TMP% 2>nul if exist %TMP%\listimg.txt del %TMP%\listimg.txt java -jar bin\saxon.jar %RSRC%\%1 XML/XSL/list_img.xsl
<?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:dg="http://ns.dg77.net/XML/" xmlns:d="http://ns.dg77.net/XML/d/" xmlns:saxon="http://icl.com/saxon" extension-element-prefixes="saxon" exclude-result-prefixes="dg d saxon" > <xsl:output method="text" /> <xsl:param name="tmp"/> <!-- Routines xslt pour traitement divers extraction chemin / nom fichier etc. --> <xsl:include href="dg_tchemin.xsl" /> <xsl:variable name="protoc">http</xsl:variable> <xsl:variable name="ssdom">www</xsl:variable> <xsl:variable name="domaine">dg77.net</xsl:variable> <xsl:template match="/"> <xsl:result-document href="{$tmp}listimg.txt"> <xsl:for-each select="d:www/d:page"> <!-- récupère le chemin seul => xchem ôter le nom du fichier à droite --> <xsl:variable name="imgchemin"> <xsl:call-template name="xchemin"> <xsl:with-param name="chemin"> </xsl:with-param> <xsl:with-param name="chaine" select="@nomfic"/> </xsl:call-template> </xsl:variable> <!-- Images --> <xsl:for-each select="descendant::*/dg:img"> <xsl:variable name="wsrc"> <xsl:choose> <xsl:when test="contains(@src, concat($ssdom,'.',$domaine))"> <xsl:value-of select="substring-after(@src, concat($protoc, '://', $ssdom, '.', $domaine, '/'))" /> </xsl:when> <xsl:otherwise> <xsl:value-of select="@src"/> </xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:value-of select="$imgchemin"/><xsl:value-of select="$wsrc"/><xsl:text> </xsl:text><xsl:value-of select="$wsrc"/><xsl:text> </xsl:text> </xsl:for-each> <!--Galeries d'images --> <xsl:for-each select="descendant::*/d:galimage"> <xsl:value-of select="d:galfic"/>.jpg<xsl:text> </xsl:text><xsl:value-of select="d:galfic"/>.jpg<xsl:text> </xsl:text> <xsl:variable name="nomf"> <xsl:call-template name="extrnom"> <xsl:with-param name="nomf"><xsl:value-of select="d:galfic"/></xsl:with-param> </xsl:call-template> </xsl:variable> <xsl:variable name="imgchem"> <xsl:call-template name="xchemin"> <xsl:with-param name="chemin"> </xsl:with-param> <xsl:with-param name="chaine" select="d:galfic"/> </xsl:call-template> </xsl:variable> <xsl:value-of select="$imgchem"/>t_<xsl:value-of select="$nomf"/>.jpg<xsl:text> </xsl:text><xsl:value-of select="$imgchem"/>t_<xsl:value-of select="$nomf"/>.jpg<xsl:text> </xsl:text> </xsl:for-each> <!-- eventuel fichier externe --> <xsl:if test="d:description/d:docu != ''"> <xsl:variable name="fic" select="d:description/d:docu"/> <xsl:for-each select="document($fic)/descendant::*/dg:img"> <xsl:variable name="zsrc" select="@src"/> <xsl:variable name="wsrc"> <xsl:choose> <xsl:when test="substring(@src, 1, 1) = '/'"> <xsl:value-of select="substring-after(@src, '/')" /> </xsl:when> <xsl:when test="contains(@src, concat($ssdom,'.',$domaine))"> <xsl:value-of select="substring-after(@src, concat($protoc, '://', $ssdom, '.', $domaine, '/'))" /> </xsl:when> <xsl:otherwise> <xsl:value-of select="@src"/> </xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:value-of select="$imgchemin"/><xsl:value-of select="$wsrc"/><xsl:text> </xsl:text><xsl:value-of select="$zsrc"/><xsl:text> * </xsl:text><xsl:value-of select="$fic"/><xsl:text> </xsl:text> </xsl:for-each> </xsl:if> </xsl:for-each> </xsl:result-document> </xsl:template> </xsl:stylesheet>
Le fichier obtenu contient pour chaque image :
- Le nom avec chemin complet (utilisé par le programme qui va chercher les dimension).
- La chaîne indiquée par la balise img (lors de la génération de la page html, cela permettra de trouver la bonne ligne).
- Facultatif : quand les informations sont dans un fichier externe (donné par la balise docu), on indique le nom de ce fichier, précédé par un astérisque. Ceci comme aide pour savoir où copier les lignes obtenues en fin de traîtement.
photo/tech/fast_img/dagor.jpg fast_img/dagor.jpg photo/tech/fast_img/plasmat.jpg fast_img/plasmat.jpg photo/tech/fast_img/kinoplasmat75_15.jpg fast_img/kinoplasmat75_15.jpg photo/tech/fast_img/Summaron28LTM.jpg fast_img/Summaron28LTM.jpg photo/tech/fast_img/TaylorTriplet.jpg fast_img/TaylorTriplet.jpg * photo/photo_fasttrip.xml photo/tech/fast_img/ZeissTriotar.jpg fast_img/ZeissTriotar.jpg * photo/photo_fasttrip.xml photo/tech/fast_img/elmar90_4_3el.jpg fast_img/elmar90_4_3el.jpg * photo/photo_fasttrip.xml
Étape 2 : obtenir les dimensions des images
On utilise ici le programme MediaInfo [https://mediaarea.net/fr/MediaInfo] en version CLI (Command Line Interface). Ce logiciel est Open-Source [https://fr.wikipedia.org/wiki/Open_source] .
if exist %TMP%\listimgdim.txt del %TMP%\listimgdim.txt if exist %TMP%\listimg.txt (for /f %%a in (%TMP%\listimg.txt) do call bin\imgdim.bat %%a)
set "Width=" set "Height=" set "StreamSize=" set "Format=" set "Mediainfo=f:\soft\Mediainfo\Mediainfo.exe" "%Mediainfo%" --File_TestContinuousFileNames=0^ --INFORM=Image;%%Width%%-%%Height%%-%%StreamSize%%-%%Format/String%% %1^ >> %TMP%\listimgdim.txt
La clause --File_TestContinuousFileNames=0 est utile dans le cas où le nom d’images consécutives se termine par un numérotage séquentiel. Par défaut, Mediainfo va en conclure qu’il ne s’agit pas d’images distinctes mais d’une seule animation.
200-189-57381-JPEG 299-204-17982-JPEG 250-208-28933-JPEG 300-221-25854-JPEG 216-221-5247-JPEG 300-199-40255-JPEG 239-284-21066-JPEG
Étape 3 : sortie finale
Les deux fichiers précédemment créés sont fusionnés dans un fichier xml. On utilise ci-dessous un module en langage REXX [http://www.dg77.net/tekno/manuel/rexx.htm].
echo ^<d:dgdim^ xmlns:d="http://ns.dg77.net/XML/d/"> > %TMP%\listimgxml.txt call bin\list_img.rex echo ^</d:dgdim^> >> %TMP%\listimgxml.txt
/* REXX - deux fichiers texte lus en parallele */ fimg = 'tmp\listimg.txt' fdim = 'tmp\listimgdim.txt' sortie = 'tmp\listimgxml.txt' DO while lines(fimg)>0 DO while lines(fdim)>0 ligne1 = linein(fimg) parse var ligne1 nom src . ligne2 = linein(fdim) parse var ligne2 lar '-' hau '-' siz '-' for . CALL lineout sortie, ' <d:dgima dgwid="' || lar || '" dghei="' || hau || '" dgsiz="' || siz || '" dgfor="' || for || '">' || STRIP(src) || '</d:dgima>' END END
<d:dgdim xmlns:d="http://ns.dg77.net/XML/d/"> <d:dgima dgwid="200" dghei="189" dgsiz="57381" dgfor="JPEG">fast_img/dagor.jpg</d:dgima> <d:dgima dgwid="299" dghei="204" dgsiz="17982" dgfor="JPEG">fast_img/plasmat.jpg</d:dgima> <d:dgima dgwid="250" dghei="208" dgsiz="28933" dgfor="JPEG">fast_img/kinoplasmat75_15.jpg</d:dgima> <d:dgima dgwid="300" dghei="221" dgsiz="25854" dgfor="JPEG">fast_img/Summaron28LTM.jpg</d:dgima> <d:dgima dgwid="216" dghei="221" dgsiz="5247" dgfor="JPEG">fast_img/TaylorTriplet.jpg</d:dgima> <d:dgima dgwid="300" dghei="199" dgsiz="40255" dgfor="JPEG">fast_img/ZeissTriotar.jpg</d:dgima> <d:dgima dgwid="239" dghei="284" dgsiz="21066" dgfor="JPEG">fast_img/elmar90_4_3el.jpg</d:dgima> </d:dgdim>
Étape 4 : installation dans les fichiers XML
Les données XML sont à copier dans le fichier xml qui a fait l’objet du traîtement, ainsi que dans les éventuels fichiers externes (cf les "*" dans le premier fichier sorti). Il est conseillé de coller ces informations tout à la fin (avant la balise de fermeture /www).