Auswählen eines Bereichs des Desktops

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
ichbinsisyphos
User
Beiträge: 120
Registriert: Montag 4. Juni 2007, 19:19

Ich spiel mich mit dem Gedanken ein Screengrabber-Programm zu schreiben.

Hat jemand eine Idee wie ich einen Bereich auswählen könnte? Ich stell mir vor vielleicht ein halbtransparentes Fenster zu zeichnen, oder zumindest einen Rahmen.

Erstes Koordinatenpaar wird beim Drücken der Maustaste gewählt, der zweite Punkt beim Loslassen, aufgezeichnet wird das Rechteck dazwischen.

Aja, auf Linux/Xorg. Hat jemand eine Idee wie ich das angehen könnte?
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Willst du das wirklich selbst schreiben?

Fuer Einzelbilder gib's ImageMagicks import-Befehl, fuer Videos such dir hier was aus: http://www.linuxhaxor.net/2008/05/20/5- ... x-desktop/, oder ffmpeg...
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
ichbinsisyphos
User
Beiträge: 120
Registriert: Montag 4. Juni 2007, 19:19

Nein nein, ich werd eh ffmpeg verwenden. Mir gehts nur um das auswählen des Bereichs, der aufgezeichnet werden soll.

Im Grunde will ich ein rahmenloses Rechteck auf den Desktop zeichen und die Koordinaten der beiden Eckpunkte ans Programm zurückliefern, das für ffmpeg dann den Versatz und die Bildgröße berechnet.

Irgendwie hab ich aber das Gefühl, dass ich hier nicht mit einem der Toolkits arbeiten kann.
ichbinsisyphos
User
Beiträge: 120
Registriert: Montag 4. Juni 2007, 19:19

Xlib sollte helfen. Gut, dass python-xlib absolut nicht dokumentiert ist :lol:
fred.reichbier
User
Beiträge: 155
Registriert: Freitag 29. Dezember 2006, 18:27

Ein solches Rechteck (wie es z.B. scrot benutzt) kannst du erzeugen, indem du auf das Rootwindow zeichnest, und zwar mit der XOR-Methode, damit du das Gezeichnete danach wieder einfach "löschen" kannst (einmal ein Rechteck zeichnen ergibt den Rahmen, wenn du ein zweites Mal drübermalst, haben diese Pixel wieder die Originalfarbe). Hier hätte ich so etwas ähnliches (das ist ein Plugin des wms, bei dem ich mitmach. Das ist für die Vorschau beim Verschieben und Vergrößern/Verkleinern von Fenstern zuständig.), allerdings benutzt dieses Snippet ein eigenes X-Binding. Das Ganze sollte aber relativ einfach auf python-xlib übertragen werden können. Eigentlich erstellst du nur einen Graphics Context mit der function XOR, einem weißen foreground pixel und dem subwindow mode "include inferiors", und dann zeichnest du ein Rechteck auf das Rootwindow, wobei du halt darauf achten musst, dass du über die alten Rechtecke nochmal drübermalst. Neben der etwas lückenhaften Doku von python-xlib kannst du auch das Xlib Programming Manual benutzen, die Erklärungen da sind ziemlich gut ;)

Hm, ich hoffe, du wirst aus meiner Erklärung schlau :D
ichbinsisyphos
User
Beiträge: 120
Registriert: Montag 4. Juni 2007, 19:19

"lückenhafte Doku" ist gut :lol: Das beste daran sind noch die Verweise auf die original Doku. Und das pydoc ist quasi leer.

Aber danke für die links, ich denke, ich werd schon damit zurecht kommen.
Markus12
User
Beiträge: 195
Registriert: Dienstag 6. März 2007, 19:32
Wohnort: Frankfurt am Main

Ich weiß nicht, ob das auch unter Linux verfügbar ist, aber die PIL Datenbank, mit der man alles mögliche mit Bildern machen kann, hat ein Modul ImageGrab, das mit der methode ´grab´ einen Screenshot aufnimmt. Als Argument kannst du der Funktion das Argument bbox übergeben, was ein Tupel aus Koordinaten auf deinem Bildschirm zusammengesetzt ist. Das sollte funktionieren, habe dieses limitierte Aufnehmen des Bildschirms noch nicht verwendet, aber das Modul funktioniert auf jeden Fall ausgezeichnet.

Hoffe, das hilft weiter.

Habe selbst mal ein Screenshotprogramm geschrieben, dass genau das macht, was ich will.

Viele Grüße Markus :D
ichbinsisyphos
User
Beiträge: 120
Registriert: Montag 4. Juni 2007, 19:19

Ja, aber ich will ein Video, bzw mind 10 Einzelbilder pro Sekunde.

Aber ich hab ein neues Problem entdeckt, kann ich nicht einfach über alles drüber malen? Oder kann ich ein transparentes window erstellen, dass sich über den ganzen Desktop spannt? Auf das root-window zeichen hab ich bisher geschafft.
fred.reichbier
User
Beiträge: 155
Registriert: Freitag 29. Dezember 2006, 18:27

Mit dem subwindow mode "include inferiors" sollte sich eigentlich über alles drübermalen lassen, wenn du auf das Rootwindow malst.
Markus12
User
Beiträge: 195
Registriert: Dienstag 6. März 2007, 19:32
Wohnort: Frankfurt am Main

ichbinsisyphos hat geschrieben:Ja, aber ich will ein Video, bzw mind 10 Einzelbilder pro Sekunde.

Aber ich hab ein neues Problem entdeckt, kann ich nicht einfach über alles drüber malen? Oder kann ich ein transparentes window erstellen, dass sich über den ganzen Desktop spannt? Auf das root-window zeichen hab ich bisher geschafft.
Verstehe ich nicht ganz.

Maximieren kannst du ein Fenster mit

Code: Alles auswählen

root.state("zoomed")
Ränder verschwinden lassen mit

Code: Alles auswählen

root.overrideredirect(True)
Transparent kann man ein Fenster machen, indem man folgendes verwendet:

Code: Alles auswählen

root.attributes("-alpha", 0.0)
Das zweite Argument muss eine Integer zwischen 0.0 (0% sichtbar) und 1.0 (100% sichtbar) liegen.

Ob das deine Frage beantwortet: Keine ahnung ;)

Grüße Markus :D
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Markus12 hat geschrieben:Das zweite Argument muss eine Integer zwischen 0.0 (0% sichtbar) und 1.0 (100% sichtbar) liegen.
Na dann ist es ja alles andere als ein Integer (Ganzzahl).
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
ichbinsisyphos
User
Beiträge: 120
Registriert: Montag 4. Juni 2007, 19:19

Markus12 hat geschrieben:
ichbinsisyphos hat geschrieben:Ja, aber ich will ein Video, bzw mind 10 Einzelbilder pro Sekunde.

Aber ich hab ein neues Problem entdeckt, kann ich nicht einfach über alles drüber malen? Oder kann ich ein transparentes window erstellen, dass sich über den ganzen Desktop spannt? Auf das root-window zeichen hab ich bisher geschafft.
Verstehe ich nicht ganz.

Maximieren kannst du ein Fenster mit

Code: Alles auswählen

root.state("zoomed")
Ränder verschwinden lassen mit

Code: Alles auswählen

root.overrideredirect(True)
Transparent kann man ein Fenster machen, indem man folgendes verwendet:

Code: Alles auswählen

root.attributes("-alpha", 0.0)
Das zweite Argument muss eine Integer zwischen 0.0 (0% sichtbar) und 1.0 (100% sichtbar) liegen.

Ob das deine Frage beantwortet: Keine ahnung ;)

Grüße Markus :D
Ich hab leider bis Ende Juni fast keine Zeit das auszuprobieren, aber ganz einfach ist das nicht. Transparente windows gibts ja nur, wenn man compositing enabled hat. Und das brauch ich normalerweise nicht, habs deswegen deaktiviert.

Ich werd vermutlich den Weg versuchen, einen Screenshot zu machen, in einem maximierten Fenster anzuzeigen und auf dem zu zeichnen. Sobald der Bereich gewählt ist kann ich das Fenster wieder zerstören. Is ein bisserl plump, aber wahrscheinlich reichts.

Im Endeffekt wärs mir aber lieber, das Rechteck bleibt angezeigt, so lange aufgezeichnet wird. Das wär dann ausreichend als Statusanzeige, dann brauch ich für die gesamte Interaktion nur noch ein stop-button oder anderen Event zum Abbrechen.

Das "include inferiors" muss ich mir mal ansehen, das wär ja wirklich einfach.
Antworten