Mam w środku plik SVG, który zawiera co najmniej jeden osadzony obraz JPG / PNG. Chcę wyodrębnić obrazy JPG / PNG z tego pliku SVG i zapisać je na dysku.
Dodaję inkscape
tag, ponieważ jest to program, którego używam do edycji plików SVG, ale akceptuję również rozwiązania przy użyciu innych narzędzi.
xml.etree
biblioteki.Odpowiedzi:
Moje własne rozwiązanie (lub ... obejście):
XML Editor
( Shift+ Ctrl+ X)xlink:href
atrybut, który będzie zawierał obraz jako dane: URIdata:
identyfikator URIdata:
identyfikator URI do przeglądarki i stamtąd go zapisz.Alternatywnie mogę otworzyć plik SVG w dowolnym edytorze tekstu, zlokalizować
data:
identyfikator URI i stamtąd go skopiować.Chociaż to rozwiązanie działa, jest trochę kłopotliwe i chciałbym nauczyć się lepszego.
źródło
Zamiast tego istnieje lepsze rozwiązanie:
przejdź do
Extensions -> Images -> Extract Image...
, tam możesz zapisać wybrany obraz rastrowy jako plik. Jednak to rozszerzenie działa dziwnie i jakoś działa raczej powoli (ale idealnie dobrze).Kolejna uwaga: to rozszerzenie jest nieporęczne i umiera cicho na różnych dużych obrazach. Ponadto przy dużej liczbie obrazów rastrowych może zwiększyć wykorzystanie pamięci Inkscape do przerażających poziomów (jak 3 GB po wyodrębnieniu tylko kilku zdjęć).
Ponieważ mam około 20 plików SVG z około 70 obrazami rastrowymi, każdy obraz o wielkości co najmniej 1 MB, potrzebowałem innego rozwiązania. Po krótkim sprawdzeniu za pomocą końcówki Denilson Sá opracowałem następujący skrypt php, który wyodrębnia obrazy z plików svg:
W ten sposób mogę uzyskać wszystkie potrzebne obrazy, a md5 ratuje mnie przed powtarzaniem się.
Założę się, że musi być inny sposób, który jest o wiele prostszy, ale twórcy inkscape muszą to zrobić lepiej.
źródło
data:
adres URL w wierszu i nie obsługuje znaków nowej linii w atrybucie href (inkscape dodaje je do adresów URL danych, a specyfikacja base64 nawet nakazuje, aby wiersze nie miały więcej niż 76 znaków ). Fajny skrypt do szybkiego włamania, ale nie działa ze wszystkimi rodzajami SVG.Wreszcie, lata później napisałem skrypt, aby poprawnie wyodrębnić wszystkie obrazy z pliku SVG, używając odpowiedniej biblioteki XML do analizy kodu SVG.
http://bitbucket.org/denilsonsa/small_scripts/src/tip/extract_embedded_images_from_svg.py
Ten skrypt został napisany dla Pythona 2.7, ale jego konwersja do Pythona 3 powinna być łatwa. Co więcej, po konwersji do Pythona 3.4 można usunąć około 50 wierszy ze względu na nowe funkcje wprowadzone w tej wersji.
źródło
cElementTree
ma być szybsze. Ale może coś takiego jak Sax również działa lepiej.cElementTree
jest prawdopodobnie szybszy. Jednak w Pythonie 3.3 oba są takie same . W pewnym momencie prawdopodobnie zaktualizuję ten skrypt do Pythona 3.Jako kolejne obejście można zapisać jako plik PDF, a następnie otworzyć ten dokument za pomocą Inkscape.
Odznacz „osadzanie obrazów” i bingo, wszystkie pngs / jpegs zostaną wyrzucone do twojego katalogu domowego.
Bałagan, ale szybciej niż wygłupiać się z danymi: URL.
źródło
Poprawiam skrypt php @Johnny_Bit . Nowa wersja skryptu może używać svg z nowymi wierszami. Wyodrębnia wiele obrazów z pliku svg i zapisuje je w zewnętrznych plikach png. Pliki SVG i PNG znajdują się w katalogu „SVG”, ale można to zmienić w stałej „SVG_DIR”.
źródło
Otwórz plik w Inkscape i wybierz mapę bitową, którą chcesz wyeksportować. Kliknij Plik-> Eksportuj bitmapę (Ctrl + Shift + E) i powinna wyeksportować tylko wybraną bitmapę.
źródło