Outil pour traîter les dimensions d’images
Introduction Étape 1 : dresser la liste des images Étape 2 : obtenir les dimensions des images Étape 3 : sortie finale Étape 4 : installation dans les fichiers XML
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.
Envoi par batch sous Windows 10 :
:: 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
Module XSLT (utilisation du processeur Saxon) :
<?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.
Exemple de fichier sorti :
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] .
Suite du traitement batch. Boucle "for" qui appelle un traîtement à chaque ligne lue :
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)
Procédure imgdim.bat :
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.
Exemple de fichier sorti :
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] .
Lancement dans le .bat :
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
Programme de fusion :
/* 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
Exemple de fichier XML en sortie finale :
<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 ).