Comment adapter des dessins svg à leur toile sur la ligne de commande?

13

Le recadrage de .svgfichiers sur la ligne de commande est simple: $ inkscape --verb=FitCanvasToDrawing --verb=FileSave --verb=FileClose *.svg

Je dois faire le contraire. Je souhaite insérer le dessin dans un 64 x 64canevas de points (déjà défini dans tous les .svgfichiers). Malheureusement, Inkscape ne fournit pas de FitDrawingToCanvascommande. De plus, l'ajustement doit conserver le rapport hauteur / largeur du dessin.

Si cela est important: j'utilise Ubuntu raring.

Stefan Endrullis
la source
1
Souhaitez-vous redimensionner après avoir ajusté la toile au dessin? Voir graphicdesign.stackexchange.com/questions/6574/…
Takkat
Deux questions: (1) la taille du canevas est déjà définie dans chaque instance, mais les dessins sont plus grands que le canevas; ou insérez-vous un dessin svg dans un autre document svg ?; (2) "garder le rapport hauteur / largeur": c'est déroutant à la lumière de la toile carrée de 64 points mentionnée dans vos questions, mais avez-vous un processus de décision automatisé proposé pour savoir comment gérer le matériel non carré? par exemple, la hauteur doit être de 64 points dans tous les cas ...
horatio
@Takkat: Merci pour l'astuce. Le flux de travail fonctionne, mais le rapport hauteur / largeur est détruit.
Cherchera
@horatio: (1) le dessin est plus petit que le canevas et oui, les deux sont dans le même fichier. (2) Je veux mettre le dessin à l'échelle au point que max (drawingWidth, drawingHeight) = 64 pt.
Stefan Endrullis du
@Takkat: rsvg-convert a un argument --keep-aspect-ratio :)
Stefan Endrullis

Réponses:

2

J'ai trouvé un moyen de le faire dans cette question: Inkscape - Centrer le dessin sur la page via la ligne de commande / le terminal

Avec "foo.svg" comme image à éditer:

inkscape --verb=EditSelectAll --verb=AlignHorizontalCenter --verb=AlignVerticalCenter --verb=FileSave --verb=FileQuit foo.svg

Pour éditer toutes les images svg dans le répertoire courant:

inkscape --verb=EditSelectAll --verb=AlignHorizontalCenter --verb=AlignVerticalCenter --verb=FileSave --verb=FileClose *.svg

Mais cette deuxième commande ouvre une tonne de fenêtres, ce qui fera planter votre ordinateur si vous modifiez trop d'images. Pour Linux uniquement , cette commande fonctionnera mieux:

for img in $(ls *.svg) ; do inkscape --verb=EditSelectAll --verb=AlignHorizontalCenter --verb=AlignVerticalCenter --verb=FileSave --verb=FileQuit $img ; done

Pour la commande ci-dessus, si l'un des fichiers est un lien symbolique, Inkscape modifiera le fichier cible vers lequel le lien symbolique pointe. Si vous ne voulez pas qu'Inkscape le fasse, vous pouvez filtrer les liens symboliques avec cette commande:

for img in $(ls *.svg) ; do if [[ $(readlink $img) == "" ]] ; then inkscape --verb=EditSelectAll --verb=AlignHorizontalCenter --verb=AlignVerticalCenter --verb=FileSave --verb=FileQuit $img ; fi ; done


Pendant que j'y suis, je pourrais aussi bien poster le script bash que j'ai fait pour cela:

#!/bin/bash
# inkscape-center <file-or-directory>...

_analyse() {
    if [ -d "${1}" ] ; then
        _centerAll "${1}" ;
    else
        _center "${1}" ;
    fi
}

_centerAll() {
    cd "${1}" ;
    for img in $(ls "*.svg") ; do
        _filterSyms "${img}" ;
    done
}

_filterSyms() {
    if [[ $(readlink "${1}") == "" ]] ; then
        _center "${1}"
    fi
}

_center() {
    inkscape --verb=EditSelectAll --verb=AlignHorizontalCenter --verb=AlignVerticalCenter --verb=FileSave --verb=FileQuit "${1}"
}

for arg ; do
    _analyse "${arg}" ;
done

Je l'ai appelé inkscape-centeret l' ai exécuté comme ceci:

inkscape-center <file-or-directory>

Cela prend autant d'arguments que vous le souhaitez, vous pouvez donc faire quelque chose comme ceci:

inkscape-center 1st.svg 2nd.svg 3rd.svg 4th.svg

Soyez prudent - Si vous spécifiez un répertoire au lieu d'un fichier, il éditera chaque fichier svg dans ce répertoire.

GreenRaccoon23
la source
1

Vous pouvez utiliser viewBox pour accomplir ce que vous voulez. Je ne sais pas s'il existe un moyen de le faire à partir d'Inkscape, mais comme SVG est un format standard et il peut y avoir un autre outil qui fera le travail que vous voulez. Une recherche rapide des «outils de ligne de commande svg» a révélé des résultats intéressants, y compris celui-ci pour la création d'icônes CSS.

Une deuxième option serait d'écrire votre propre outil dans la langue de votre choix pour ce faire. L'essentiel est de définir la viewBox à la hauteur de votre document, puis de définir la largeur et la hauteur du document souhaité. Enfin, définissez l'attribut preserveAspectRatio.

Voici à quoi ressemblent les modifications décrites ci-dessus sur un document qui était à l'origine 744x1052.

<svg
   width="64"
   height="64"
   viewBox="0 0 744 1052"
    preserveAspectRatio="xMinYMin slice"
BrianV
la source