verlustfreie Grafik erstellen

Fragen zu Tkinter.
Antworten
Benutzeravatar
Goswin
User
Beiträge: 363
Registriert: Freitag 8. Dezember 2006, 11:47
Wohnort: Ulm-Böfingen
Kontaktdaten:

Ich möchte eine parametrische (nicht animierte) Grafik einer geometrischen Figur erstellen, die ich verlustfrei abspeichern kann. Parametrisch bedeutet für mich zum Beispiel, dass ich eine gerade Linie anhand ihrer algebraischen Gleichung eingeben kann, deren Parameter unter Umständen von einem komplizierteren Python-Programm errechnet werden.

Früher habe ich so etwas in Adobe-Postscript programmiert, aber das war wegen der umgekehrten polnischen Notation ziemlich mühsam. Auch habe Ich es einmal mit Hilfe von Tkinter's Canvas-Widget probiert und die Grafik auf den Bildschirm gekriegt, aber dann konnte ich das Ganze nur über einen Screen-Snapshot abspeichern, und der war natürlich alles anders als verlustfrei-skalierbar. Gibt es eine Möglichkeit, eine Tkinter-Ausgabe über ein "png-Format" ( :oops: gemeint ist: svg-Format) oder sonst ein Vektorformat verlustfrei-skalierbar abzuspeichern?
Zuletzt geändert von Goswin am Montag 13. Februar 2012, 14:02, insgesamt 3-mal geändert.
deets

PNG ist ein Pixel-format - also per Definition verlustbehaftet.

Was du willst geht nur mit einem Vektor-Format. Da wuerde sich heutzutage SVG anbieten. Wie du das aber dann am besten renderst um es in Tk darzustellen - kA. Third-party-tools oder libs gibt's da bestimmt, aber ob was aus Python heraus einfach anwendbar ist musst du mal recherchieren.
Benutzeravatar
mkesper
User
Beiträge: 919
Registriert: Montag 20. November 2006, 15:48
Wohnort: formerly known as mkallas
Kontaktdaten:

Ich würde mir mal matplotlib anschauen. Da gibt es auch Backends, die z.B. SVG erzeugen können.
Benutzeravatar
Goswin
User
Beiträge: 363
Registriert: Freitag 8. Dezember 2006, 11:47
Wohnort: Ulm-Böfingen
Kontaktdaten:

Meinen Dank an deets und mkesper :)

@deets:
svg habe ich mir inzwischen genauer angeschaut. Wenn ich es richtig verstehe, ist es (im Gegensatz zu postscript) nicht Turing-vollständig, das heisst, ich kann keine Parameter in die Konstruktionen einbauen und müsste also mir Hilfe einer parametrischen Python-Funktion eine XML-Datei erzeugen, die dann die svg-Grafik rendert. Ich kann momentan nicht abschätzen wie kompliziert das ist (unter Umständen genauso kompliziert wie Postscript). Anderseits ist es vielleicht ganz nützlich, sich im Erstellen von XML-Dateien zu üben.

@mkesper:
Die Bildergalerie von matplotlib ist umwerfend beeindruckend, und numpy benutze ich ja sowieso; das Projekt sieht toll aus. Skalierbar scheint es aber auch nicht zu sein, da die Ausgabe anscheinend immer im png-Format und nicht in Vektorgrafik stattfindet. Und dann ist das ganze (vorläufig?) ja nur mit Python 2.x aufzurufen, wo ich mich nun vollständig auf Python 3.x umgestellt habe. Das beste wird wohl sein, ich warte einmal ab, bis matplotlib auch für Python 3.x existiert.

Mein derzeitiges Fazit: Die Zeit ist offenbar noch nicht ganz reif für verlustfrei-skalierbare Velktorgrafiken mit Python (gemeint war: 3.x). In wirklich eiligen Fällen sollte ich wohl weiterhin ein parametrisches Canvas mit tkinter erstellen und mir ein nichtskalierbares postscript ausgeben lassen. Für den Aufrufer meiner Dateien ist das vielleicht enttäuschend (er kann sie nicht vergrößern und sonstwie abändern), aber ich selber habe natürlich eine beliebig einstellbare Ausgabe.
Zuletzt geändert von Goswin am Montag 13. Februar 2012, 18:08, insgesamt 1-mal geändert.
BlackJack

@Goswin: Matplotlib kann neben PNG noch alles mögliche andere schreiben. Unter anderem PostScript, PDF, und SVG.

Dein Fazit ist Unsinn. Es gibt viele Wege verlustfrei skalierbare Vektorgrafiken mit Python zu erzeugen. Von SVG oder PostScript selbst „per Hand” erstellen, über Bibliotheken um PostScript (`pyx`, `pyscript`) oder PDF (`reportlab`) zu erstellen, bis zu Grafikbibliotheken (`cairo`) oder GUI-Toolkits (Qt) mit jeweils mehreren Backends. Die Zeit ist vielleicht noch nicht reif für Python 3.x weil dort hin noch nicht alles portiert ist.
deets

@Goswin

parametrische Darstellungen in PS moegen ja an sich netter sein als sie das in SVG sind. Aber wirklich einen Unterschied kann ich nicht erkennen. Denn entweder kennst du alle Startwerte, und dann kannst du die genauso gut (oder gar besser) in Python durchrechnen + in die SVG-Attribute pumpen.

Oder nicht - aber dann kann ich deine PS-Grafik auch nicht ohne eine Runtime aufmachen, in der ich eben genau diese Parameter festlege.
Benutzeravatar
Goswin
User
Beiträge: 363
Registriert: Freitag 8. Dezember 2006, 11:47
Wohnort: Ulm-Böfingen
Kontaktdaten:

Mein Problem einmal anders formuliert:

Wenn ich mir eine Grafik von Wikipedia (oder anderswo) herunterlade, ärgere ich mich oft darüber, dass diese zu klein ist und ich sie auch nicht vergrößern kann, ohne dass sie Schärfe verliert und schlecht aussieht. Bevor ich nun selber anfange, Grafiken ins Internet zu stellen, wollte ich etwas netter sein und anderen Benutzern diesen Ärger ersparen. Ich hatte (bis gestern) *keine Ahnung*, wie man das am besten macht, und ob ich mir da nicht zuviel vorgenommen habe. Was Grafiken anbetrifft, habe ich bisher nur etwas Postscript programmiert (prima zum einfügen in TeX-Dateien) und letztens *ein wenig* Tkinter, womit man (wie ich gerade gesehen habe) anscheinend auch Postscript-Dateien erstellen kann. (Manchmal tue ich mich schwer, auf eure Antworten zu reagieren, weil ich viele Ausdrücke, wie zum Beispiel "Runtime" oder "Backend" einfach nicht verstehe)


Mein obiges Fazit gilt *nur* für mich persönlich; ich bin mit dem derzeitigen Angebot offenbar überfordert und hatte mir (als nicht-Informatiker) die Sache einfacher vorgestellt als sie ist. Ich bin einverstanden mit deets, dass ich die Startwerte in Python durchrechnen und in die SVG-Attribute pumpen kann. Das verlangt freilich (was Grafiken anbelangt) die Entscheidung, von tkinter auf svg umzusteigen...

...oder lieber doch auf die Python-3.x-Portierung von matplotlib zu warten, da BlackJack treffend darauf hinweist, dass matplotlib auch svg kann (da die Beispiele alle in png waren, bin ich gar nicht auf die Idee gekommen, dass es auch anders geht).
BlackJack

@Goswin: Dass die Beispiele auf der Numpy-Webseite, genau wie fast allen Webseiten, als Pixelgrafik vorliegen, liegt daran, dass nur JPEG, PNG, und GIF wirklich von so ziemlich jedem (grafischen) Browser direkt „verstanden” und angezeigt werden. Bei Wikipedia gibt es aber bei Pixelgrafiken, die aus einem Vektorformat erzeugt wurden, gar nicht so selten ein SVG zum herunterladen.

Wenn Du jetzt also selber Grafiken ins Netz stellst, wäre es für die Benutzer wahrscheinlich am nettesten wenn Du eine Pixelgrafik verwendest und die mit einem Link zur Vektorversion versiehst. Nur Vektorgrafik schliesst einige (viele?) Benutzer davon aus die Grafik *überhaupt* zu sehen.

Runtime würde man hier mit Laufzeitumgebung übersetzen.

Backend habe ich glaube ich noch nie übersetzt. Laut Wikipedia ginge „Unterbau”: http://de.wikipedia.org/wiki/Front-End_und_Back-End
Antworten