Wie kann man unter Linux die Größe aller .svg-Bilder in einem Ordner gleichzeitig ändern?

Ich habe einige Bilder, die ich in Inkscape mit .svgErweiterung erstellt habe. Diese Bilder haben verschiedene Pixelgrößen (256*265, 512*512 usw.).

Wie kann ich die Größe all dieser Bilder auf einmal in Linux ändern?

Der Vorschlag von @Joonas, ImageMagick zu verwenden, steht im Widerspruch zu diesem Ratschlag: Vermeiden Sie die Verwendung von ImageMagick für Konvertierungen von „Vektorbildern“ in „Vektorbilder“ . Inkscape würde rastern (in Bitmap konvertieren): nicht sicher, ob es ab 2021 noch wahr ist.

Antworten (2)

Ich habe die Lösung für mein Problem gefunden, der Weg dazu ist die Verwendung vonrsvg-converter

und nach der Suche in 3W habe ich dieses Skript hier gefunden

Alles, was Sie brauchen, ist, dieses Skript ausführbar zu machen und es auszuführen, gefolgt von einer neuen Größe für Ihre .svgDatei(en).

Was ist, wenn ich einen Skalierungsfaktor möchte, anstatt alle SVGs gleich groß zu machen?

Tu es nicht

Ohne zu wissen, warum Sie dies tun möchten, ist meine erste Reaktion , tun Sie es nicht .

Die Größe einer SVG-Datei ist wirklich ein Vorschlag – sie sind so konzipiert, dass sie in der Größe vergrößert und verkleinert werden können (daher skalierbare Vektorgrafiken). Die Höhe und Breite einer SVG-Datei spielt für die meisten praktischen Anwendungen keine Rolle. Wenn Sie möchten, dass das Bild (zum Beispiel) auf einer Webseite größer wird, können Sie einfach die Höhen- und Breitenattribute festlegen. Wenn Sie in eine PNG-Datei exportieren, können Sie die Abmessungen beliebig festlegen. Die Attribute heightund widthmüssen tatsächlich nicht einmal vorhanden sein. Wenn für das Root-Element keine Höhe oder Breite angegeben ist <svg>, wird es standardmäßig auf 100 % gesetzt.

Das Herumspielen mit Höhe und Breite verpasst wirklich einen der großen Vorteile von SVG-Dateien, nämlich die Skalierbarkeit.

Aber wenn du es wirklich willst...

Es kann Fälle geben, in denen Sie die Höhe und Breite einer SVG-Datei wirklich festlegen müssen, aber meiner Meinung nach liegt dies normalerweise an einer Einschränkung Ihres Arbeitsablaufs oder Ihrer Tools.

SVG-Dateien sind nur XML-Dateien – Sie können eine in einem Texteditor öffnen und einen Blick darauf werfen. Sie können sie wie jede andere XML-Datei bearbeiten. Mozilla Dev Network hat eine fantastische Referenz , um mehr über die XML-Seite von SVG-Dateien zu erfahren.

Um eine XML-Datei zu manipulieren, ist die herkömmliche Methode die Verwendung von XSL, einer Stylesheet-Sprache zum Transformieren einer XML-Datei in etwas anderes (normalerweise eine andere XML-Datei).

Beispiel

Erstellen Sie eine Textdatei mit dem Namen scale-svg.xsl und fügen Sie den folgenden Inhalt ein:

<xsl:stylesheet version="1.0">
    <xsl:output method="xml"/>
    <xsl:template match="svg:svg">
        <xsl:copy>
            <xsl:copy-of select="svg:metadata|svg:defs|sodipodi:namedview"/>
            <xsl:element name="svg:g">
                <xsl:attribute name="transform">
                    <xsl:value-of select="concat(concat('scale(',$scale),')')"/>
                </xsl:attribute>
                <xsl:copy-of select="*[not(svg:metadata|svg:defs|sodipodi:namedview)]"/>
            </xsl:element>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

Jetzt müssen Sie das Stylesheet auf eine SVG-Datei (oder Dateien) anwenden. Es sind viele XSLT-Programme verfügbar. Wenn Sie Linux verwenden, xlstprocist es wahrscheinlich bereits installiert.

# This command will scale small.svg up by 3x
$ xsltproc --stringparam scale 3 scale-svg.xsl small.svg>big.svg

# This command will scale all SVG files in the current directory
$ for f in *.svg; do xsltproc --stringparam scale 3 scale-svg.xsl $f>3x_$f; done 

Wenn Sie etwas anderes tun möchten (z. B. die Höhe und Breite des SVG-Dokuments ändern, anstatt es zu skalieren), müssen Sie die XSL-Datei an Ihre Anforderungen anpassen. Es gibt viele Tutorials zu XSL, wie zum Beispiel dieses bei W3Schools .

Es gibt auch andere Ansätze, die Sie verfolgen. Eine schnelle Google-Suche fand auch svg-resizer , ein JavaScript-basierter Ansatz mit rsvg. Sie können ImageMagick wahrscheinlich auch dazu bringen.

Kann Inkscape das für mich erledigen?

Obwohl Inkscape über Batch-Verarbeitungsfähigkeiten verfügt, glaube ich nicht, dass es dies tun kann (auch hier sind die Abmessungen einer SVG-Datei Vorschläge, daher ist die Nützlichkeit begrenzt).

Inkscape kann den Export von SVG-Dateien in verschiedenen Größen automatisieren. Die Inkscape-Befehlszeilenoptionen haben die Möglichkeit, die Höhe und Breite beim Exportieren einer PNG-Datei manuell festzulegen.

Kompilierungsfehler: Datei scale-svg.xsl Zeile 1 Element xsl:stylesheet xsltParseStylesheetProcess : Dokument ist kein Stylesheet
Es gibt Situationen, in denen einige Befehlszeilenprogramme (z. B. Spritezero) SVG in Rasterbilder konvertieren, indem sie die Attribute viewBox, width und height von svg verwenden, sodass diese Attribute (und Pfadkoordinaten) nicht immer nur Vorschläge sind.
scale-svg.xsl:1: namespace error : Namespace prefix xsl on stylesheet is not defined
„Tu es nicht“ ist für einige Anwendungsfälle zu weit gefasst. Wenn Bob eine Reihe von SVG-Dateien unterschiedlicher Größe hat und sie Alice gibt, muss Alice bei der Verwendung möglicherweise die Größe jeder Datei manuell ändern, wie in dieser Antwort vorgeschlagen. Es kann viel einfacher sein, die Größe aller mithilfe eines Befehlszeilenskripts zu ändern , sodass Alice „Plug and Play“ verwenden kann, ohne jedes einzeln auf die erforderlichen Abmessungen ändern zu müssen. Sie haben Recht, dies ist ein Workflow-Problem, aber viele Workflows ändern die Größe von SVGs nicht automatisch (meiner nicht).
⚠️ Hinweis: ImageMagick.org gibt an, dass es die Größe von SVGs nicht verlustfrei ändern kann, da es einen Zwischenschritt gibt: die Rasterung. Siehe "Ein Wort zu Vektorbildformaten" auf Imagemagick.org , aber nicht sicher, ob dies ab 2021 noch zutrifft.