Tkinter / Canvas Pixelfarbe auslesen

Fragen zu Tkinter.
Antworten
Night4ngel
User
Beiträge: 10
Registriert: Dienstag 19. Juni 2012, 20:15

Hi Leute,
bin neu hier, habe aber schon ein wenig Erfahrung mit Python, also wenn ihr mir helfen wollt, lasst bitte nicht sowas hören wie: "wieso denn überhaupt"... :)

Also: Ich bin bereits seit einem Halben Jahr am suchen, stoße aber immer nur auf tote Threads oder auf Lösungen,die mich nicht weiter bringen.
Ich benötige eine Modulerweiterung/Methode oder einfach irgendeine Möglichkeit die aktuelle Farbe eines Pixels auslesen zu können. Ob auf der Canvas oder im Tkinter (wahrscheinlich eher weniger) ist mir egal.

Ich stelle mir folgendes vor:

Code: Alles auswählen

pixelfarbe = c.find_pixelcolor(x, y)
print pixelfarbe
>>> '#00FF00'
also, dass ich in eine Variable schreiben kann, welche Farbe ein spezieller Pixel hat.

Ich habe viel gesucht, und bin auf viele gestoßen, die ganz ähnliche Fragen gestellt haben und zu keiner Lösung gekommen sind.
Ich habe aber auch Beiträge gefunden, in denen Leute eine einfache Hilfe dazu bekommen haben, leider waren die Links immer tot.

Im Moment nutze ich Python 2.7

MfG Night4ngel, thx im Voraus.
BlackJack

@Night4ngel: Ich glaube nicht das es eine einfache Lösung gibt. `Canvas` ist Vektorgrafik und keine Pixelgrafik. Du müsstest also herausfinden welche Grafikobjekte sich mit dem Punkt überschneiden und welches davon an oberster Stelle liegt beziehungsweise wenn es „Löcher” in den Objekten gibt, welches an der Stelle die Farbe festlegt. Und dann musst Du bei dem Objekt auch noch feststellen welche Farbe es an der Stelle hat. Ich wüsste nicht wie man das für alle denkbaren Fälle lösen könnte und wie gesagt, einfach ist so eine Lösung dann nicht. Der Anwendungsfall ist nicht wirklich vorgesehen. Also stelle ich Deinen Anwendungsfall doch mal in Frage oder alternativ könnte man auch sagen Canvas ist das falsche Werkzeug für Deinen Anwendungsfall.
Night4ngel
User
Beiträge: 10
Registriert: Dienstag 19. Juni 2012, 20:15

Danke für die schnelle Antwort.

Was würdest du mir denn empfehlen?
BlackJack

@Night4ngel: Das kommt darauf an was Du letztendlich tatsächlich lösen möchtest.
Night4ngel
User
Beiträge: 10
Registriert: Dienstag 19. Juni 2012, 20:15

Ich möchte, wei schon viele es versucht haben, es schaffen das auf der Canvas kreierte, in eine Datei zu schreiben, um es zu speichern.
Da erschien mir diese Methode am leichtesten, da ich dann einfach jeden Pixel und seine Farbe wieder aus der Datei lesen kann, um ihn auf die Canvas zu malen.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Night4ngel hat geschrieben:Ich möchte, wei schon viele es versucht haben, es schaffen das auf der Canvas kreierte, in eine Datei zu schreiben, um es zu speichern.
Ich kapiere hier kaum etwas... *wer* kreiert denn *wie* auf dem Canvas etwas? Erstellst Du so eine Art Malprogramm? Oder wie soll ich mir das vorstellen?
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Night4ngel
User
Beiträge: 10
Registriert: Dienstag 19. Juni 2012, 20:15

ja genau sowas ;)
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Night4ngel hat geschrieben:ja genau sowas ;)
Also kommt die Grafik auf dem Canvas durch Benutzereingaben zustande? Ein wenig mehr "Geschwätzigkeit" täte Dir gut ;-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Night4ngel
User
Beiträge: 10
Registriert: Dienstag 19. Juni 2012, 20:15

also ja.
Stellt euch vor der Benutzer kann mit seiner maus viele Kreise, Vierecke, Striche u.s.w auf ein Canvas malen. in verschiedenen Farben (blablabla)
Und dann möchte er das Bild abspeichern, um es nachher noch weiter zu bearbeiten, also noch was drüber malen oder so.
Wäre mir auch recht, wenn man die Canvas gleich in eine Bmp oder so schreiben kann, das hielt ich aber für eher unwahrscheinlich.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Man kann das ganze wohl in PostScript exportieren - das sollte man dann sicherlich irgend wie weiterverarbeiten können, bestimmt auch in ein Pixel basiertes Format.

Alternativ greift der aller letzte Kommentar auf dieser Seite BlackJacks Anregung nach der Suche nach einem geeigneterem Werkzeug auf.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Night4ngel
User
Beiträge: 10
Registriert: Dienstag 19. Juni 2012, 20:15

In wiefern kann mir PostScript da weiterhelfen, das verstehe ich nicht ganz...

Aber ich hab mir überlegt, man könnte ja auch einfach beim speichern alle Objekte auslesen und abspeichern. Dann kann man sie beim Öffnen wieder malen, ist halt nur sehr zeitaufwändig-.-
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Night4ngel hat geschrieben:In wiefern kann mir PostScript da weiterhelfen, das verstehe ich nicht ganz...
Hab ich Dir doch geschrieben!
Hyperion hat geschrieben:... das sollte man dann sicherlich irgend wie weiterverarbeiten können, bestimmt auch in ein Pixel basiertes Format.
Da PostScript an sich ein sehr verbreitetes Format ist, gibt es sicher Libs, die das weiterverarbeiten können und auch in ein Pixel basiertes Format wandeln kann, evtl. kann PIL das sogar. Ansonsten ggf. über ImageMagick o.ä.
Night4ngel hat geschrieben: Aber ich hab mir überlegt, man könnte ja auch einfach beim speichern alle Objekte auslesen und abspeichern. Dann kann man sie beim Öffnen wieder malen, ist halt nur sehr zeitaufwändig-.-
Dazu brauchst Du doch auch ein Serialisierungsformat - SVG wäre für Vektorgrafiken geeignet; evtl. hat jemand anders sogar schon implementiert? Such doch mal danach (pypi, google, usw.).

Wobei ich mich da nun grad frage, ob Du Dir über Deinen Anwendungsfall im klaren bist... denn wenn Du das wie bisher geschildert handhaben willst, dann widerspricht das umständliche Wandeln und Serialisieren in ein Pixel basiertes Format doch eigentlich der Tatsache, dass Du diese Bilder mit *demselben* Tool wieder laden möchtest!
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Antworten