Ich habe eine SVG-Datei, die mindestens ein eingebettetes JPG / PNG-Bild enthält. Ich möchte die JPG / PNG-Bilder aus dieser SVG-Datei extrahieren und auf der Festplatte speichern.
Ich füge das inkscape
Tag hinzu, da es das Programm ist, mit dem ich SVG-Dateien bearbeite, aber ich akzeptiere auch Lösungen, die andere Tools verwenden.
xml.etree
Bibliothek.Antworten:
Meine eigene Lösung (oder ... Problemumgehung):
XML Editor
( Shift+ Ctrl+ X)xlink:href
Attribut aus, das das Bild als Daten enthalten soll: URIdata:
URIdata:
URI in einen Browser ein und speichern Sie ihn dort.Alternativ kann ich die SVG-Datei in einem beliebigen Texteditor öffnen, die
data:
URI suchen und von dort kopieren.Obwohl diese Lösung funktioniert, ist sie etwas umständlich und ich würde gerne eine bessere lernen.
quelle
Stattdessen gibt es eine bessere Lösung:
Gehen Sie zu
Extensions -> Images -> Extract Image...
, dort können Sie das ausgewählte Rasterbild als Datei speichern. Allerdings funktioniert diese Erweiterung seltsam und irgendwie ziemlich langsam (aber vollkommen gut).Noch ein Hinweis: Diese Erweiterung ist umständlich und stirbt lautlos bei unterschiedlich großen Bildern. Mit einer großen Anzahl von Rasterbildern kann die Speichernutzung von inkscape auf entsetzliche Ebenen gesteigert werden (z. B. 3 GB nach nur einer Handvoll extrahierter Bilder).
Da ich ungefähr 20 SVG-Dateien mit jeweils ungefähr 70 Rasterbildern habe, von denen jedes mindestens 1 MB groß ist, brauchte ich eine andere Lösung. Nach einer kurzen Überprüfung mit Denilson Sá tip habe ich das folgende PHP-Skript entwickelt, das Bilder aus SVG-Dateien extrahiert:
Auf diese Weise kann ich alle gewünschten Bilder abrufen, und md5 erspart mir das wiederholte Abrufen von Bildern.
Ich wette, es muss einen anderen Weg geben, der viel einfacher ist, aber es liegt an den inkscape-Entwicklern, es besser zu machen.
quelle
data:
URL pro Zeile und keine Zeilenumbrüche innerhalb des href-Attributs (inkscape fügt sie für Daten-URLs hinzu, und die base64-Spezifikation schreibt sogar vor, dass Zeilen nicht länger als 76 Zeichen sein dürfen ). Nettes Skript für einen schnellen Hack, aber es funktioniert nicht mit allen Arten von SVG.Schließlich habe ich Jahre später ein Skript geschrieben, um alle Bilder aus einer SVG-Datei korrekt zu extrahieren und den SVG-Code mithilfe einer geeigneten XML-Bibliothek zu analysieren.
http://bitbucket.org/denilsonsa/small_scripts/src/tip/extract_embedded_images_from_svg.py
Dieses Skript wurde für Python 2.7 geschrieben, sollte sich aber recht einfach in Python 3 konvertieren lassen. Noch besser ist, dass nach der Konvertierung in Python 3.4 aufgrund der in dieser Version eingeführten neuen Funktionen etwa 50 Zeilen gelöscht werden können.
quelle
cElementTree
soll schneller sein. Aber vielleicht funktioniert so etwas wie Sax auch besser.cElementTree
ist wahrscheinlich schneller. In Python 3.3 sind jedoch beide gleich . Irgendwann werde ich dieses Skript wahrscheinlich auf Python 3 aktualisieren.Als weitere Problemumgehung können Sie das Dokument als PDF speichern und anschließend mit Inkscape öffnen.
Deaktivieren Sie "Bilder einbetten" und Bingo, alle PNGs / JPEGs werden in Ihr Home-Verzeichnis ausgespuckt.
Chaotisch, aber schneller, als mit den Daten herumzuspielen: URL.
quelle
Ich verbessere das PHP-Skript von @Johnny_Bit . Neue Version des Skripts kann Svg mit neuen Zeilen verwenden. Es extrahiert mehrere Bilder aus einer SVG-Datei und speichert sie in externen PNG-Dateien. Svg- und png-Dateien befinden sich im Verzeichnis 'svg', können jedoch in der Konstanten 'SVG_DIR' geändert werden.
quelle
Öffnen Sie Ihre Datei in Inkscape und wählen Sie die zu exportierende Bitmap aus. Klicken Sie auf Datei-> Bitmap exportieren (Strg + Umschalt + E), um nur die ausgewählte Bitmap zu exportieren.
quelle