Wie kann ich machen *Teile* einer svg-Datei?
Möchte ich render Teile einer svg-Datei durch die Namen, sondern für das Leben von mir ich kann nicht herausfinden, wie zu tun (mit python + gtk).
Hier ist die svg-Datei in Frage: http://david.bellot.free.fr/svg-cards/files/SVG-cards-2.0.1.tar.gz (Update: diese Datei nicht mehr vorhanden, aber Sie können es aufzuspüren bei http://svg-cards.sourceforge.net/)
Auf seiner Seite, David, sagt:
Können Sie eine Karte ziehen, entweder durch
Rendern Sie die Datei auf eine pixmap und
clipping jede Karte manuell oder durch
mithilfe der Karte ist der name durch einen DOM
- Schnittstelle. Alle Karten sind eingebettet in
eine SVG-Gruppe.
Ich weiß nicht, was er bedeutet, von einem DOM-Schnittstelle. Ich habe getan, einige suchen und das beste Ergebnis fand ich, dass scheint zu passen, was ich tun möchte, ist:
QSvgRenderer *renderer = new QSvgRenderer(QLatin1String("SvgCardDeck.svg"));
QGraphicsSvgItem *black = new QGraphicsSvgItem();
QGraphicsSvgItem *red = new QGraphicsSvgItem();
black->setSharedRenderer(renderer);
black->setElementId(QLatin1String("black_joker"));
red->setSharedRenderer(renderer);
red->setElementId(QLatin1String("red_joker"));
Beachten Sie jedoch, dass es für Qt und ist auch nicht in python geschrieben.
Dies ist, was ich habe, so weit:
#!/usr/bin/env python
from __future__ import absolute_import
import cairo
import gtk
import rsvg
from xml import xpath
from xml.dom import minidom
window = gtk.Window()
window.set_title("Foo")
window.set_size_request(256, 256)
window.set_property("resizable", False)
window.set_position(gtk.WIN_POS_CENTER)
window.connect("destroy", gtk.main_quit)
window.show()
document = minidom.parse("cards.svg")
element = xpath.Evaluate("//*[@id='1_club']", document)[0]
xml = element.toxml()
svg = rsvg.Handle()
svg.write(xml)
pixbuf = svg.get_pixbuf()
image = gtk.Image()
image.set_from_pixbuf(pixbuf)
image.show()
window.add(image)
gtk.main()
Es nicht funktioniert, natürlich.
Was bin ich?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die GTK-Bibliothek für das Rendern von SVG genannt wird RSVG. Es hat python-bindings, aber Sie sind ohne Papiere, und Sie don ' T wickeln Sie das
rsvg_handle_get_pixbuf_sub()
undrsvg_handle_render_cairo_sub()
Funktionen, die Sie normalerweise verwenden würden, die für diesen Zweck in C. Hier ist, was Sie zu tun haben, soweit ich das sagen kann. Sie extrahieren Sie die XML-node als Adam Crossland vorgeschlagen. Um es darzustellen, haben Sie etwas wie das hier tun:Dass, wenn Sie wollen, dass es in einem
gtk.Image
, sonst etwas anderes zu tun, mit der pixbuf. Sie können auch machen es zu ein Cairo-Kontext mithandle.render_cairo(cr)
wocr
ist Ihr Cairo-Kontext.EDIT:
Sorry, ich hatte nicht Lesen Sie die python-Bindungen eng genug auf den ersten. Die
_sub()
Funktionen werden implementiert durch verwenden derid=
argument, so dass Sie Ihr Programm kocht unten zu diesem:Getestet habe ich diese und es funktioniert. Aber das Fenster wird die Größe der gesamten SVG-canvas und ist abgeschnitten, um die Bildschirm-Größe (das ist, warum ich gemacht die 3 von Diamanten statt dem ace of clubs, die bis in die Ecke.) Also du wirst noch einen Weg finden, um die Ernte-pixbuf, um die Karte, die Sie wollen, aber das sollte nicht allzu schwer sein.
Ich glaube, dass das, was er meint, indem "durch eine DOM-Schnittstelle' ist, dass da SVG ist XML, man könnte das laden der SVG-Datei in minidom, oder eine andere Python-XML-parser, und extrahieren Sie die XML-Knoten mit bestimmten Namen, die Sie suchen. Diese XML-Knoten darstellen sollte, ein Element, das wiedergegeben werden kann.
Hier ist meine Antwort auf das zuschneiden Leerzeichen problem. Es ist eine grobe hack, aber es funktioniert großartig. Dies wäre auch ein guter Ausgangspunkt, Karten zu bekommen, für jemanden eine Karte zu machen Spiel in python.
Können Sie tun es, indem Sie den tag. Bearbeiten Sie die Breite und Höhe legen Sie das viewBox-Attribut auf der Haupt-svg-element, um das Rechteck, das Sie möchten, zu übertragen, zu wiederholen.
Sehen Wie um zu zeigen, ein Teilgebiet oder "Scheibe" einer SVG-Grafik? und http://dingoskidneys.com/~dholth/svg/
Grab zu Graben-ein bisschen hier, aber die Antwort von ptomato von 2010 funktioniert auch jetzt im Jahr 2019 für Gtk3 mit einigen leichten Modifikationen. Der code unten wird das Rendern nur die 3 von Diamanten svg-id.