Le web de Dominique Guebey – Bazar informatique

Page : http://www.dg77.net/tekno/sitedoc_i.htm


   D o m i n i q u e   G u e b e y    J u n g l e      Bazar informatique

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.

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 :

  1. Le nom avec chemin complet (utilisé par le programme qui va chercher les dimension).
  2. 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).
  3. 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).