Pixel Farbe auslesen mit Shell

K

ka111

Neues Mitglied
1
Kann man mit einem Shell Script die Pixel Farbe von einem belibigen Pixel auf dem Bildschirm herausfinden?
Wenn nicht, kann mir jemand erklären wie ich das machen kann?
Danke
 
Vielleicht so: How can I get the color of a screen pixel THROUGH ADB

Kurzfassung:
- Per Shell einen Screenshot (RAW/Bitmap) machen
- Dein Pixel-Offset berechnen
- Dann mit dd die von dir gewünschten 4 Byte (32 Bit-Farbe) "herausschneiden"
- In dem Ausschnitt stehen nun deine Farben, vermutlich als RGBA.

EDIT: Oder mit Root-Rechten ohne Screenshot, direkt aus dem Framebuffer lesen.
 
  • Danke
Reaktionen: ka111
@Thyrion

Hallo, danke für die Antwort. Ich habe jetzt viel ausprobiert mit diesem Befehl, und es funktioniert :D
Aber es sind einige Sachen noch unklar und ein paar weitere Fragen aufgetaucht.

Also zB
1.
Geht das mit dem Frambuffer nicht, entweder bekomme ich nur 0 oder es steht dd hat 0 bytes kopiert.
Bei /dev/graphics hat es fb0, fb1 und fb2 (mit allen geht es nicht).
Und auf einem älteren Smartphone funktioniert das mit dem Framebuffer und es hat nur fb0 bei /dev/graphics.
Root Rechte habe ich auf beiden Smartphones und auch vorher mit su bekommen bevor ich dd ... ausgeführt habe.
Auf der verlinkten Seite steht das es wegen neueren GPU's ist die sich nicht mehr so einfach ansprechen lassen (wenn ich das richtig verstanden habe).
Kann man da noch etwas machen oder geht das in dem Fall nicht mehr so einfach ohne spezielle Kenntnisse über die Hardware vom Smartphone?

2. Wie kann ich mehrere Pixel die nicht alle bei einander Liegen in einem Befehl auslesen? ZB. jedes 10. Pixel zwischen 100 100, 200 200. Wenn ich für jedes Pixel wieder neu dd aufrufe ist es sehr langsam.

3. Kann man die werte auch gleich in dezimal Zahlen ausgeben?
Wenn ich hexdump anstatt hd als befehl verwende habe ich mehr optionen, und es sollte eigentlich auch gehen, wenn ich das richtig gelesen habe. Es funktioniert nur nicht richtig.
Mit hexdump stehen immer 2 von den 4 Werten vertauscht zusammen, also zB anstatt FF 50 steht 50FF, und mit der Option -d steht dann 20735, was die Zahl 50FF als ganzes ist.
Mit hexdump -C stehen sie wieder einzel und so wie mit hd (ich hoffe richtig), aber mit hexdump -Cd kommen zwei Zeilen mit wieder 20735 als dezimal Zahl in einer davon...

4. Könnte man vielleicht auch gleich nur die ersten drei Werte ausgeben lassen mit hexdump oder dd? Also zB 50 50 FF anstatt 50 50 FF FF.
Und wenn ich den count bei dd auf mehr als 1 setze vielleicht auch nur die Werte von einem Pixel pro Zeile anzeigen lassen und nicht 4?

5. Evtl kann man 3. 4. mit awk machen wenn es nicht geht, wüsstest du wie? Ich kenne diesen Befehl erst seit kurzem. Ich habe schon herausgefunden wie man nur bestimmte Spalten anzeigen lässt, also zB 1., 2. und 3. (awk '{print $1, $2, $3}' /pfad/zur/datei)(Das stimmt so oder? Jedenfalls bei mir).

6. ist nicht so wichtig, aber vielleicht kannst du erklären was 2> bei dd bedeutet? Wieso nicht nur >?

Ich hoffe du kannst vielleicht noch ein paar Fragen beantworten.
Danke
 
Puh... Fragen über Fragen. Zu den meisten: Ja, das geht sicher irgendwie. Aber ich habe auch "nur" den Stack-Overflow-Artikel gefunden und hier geteilt. Ich selber habe da auch keine Erfahrungswerte drin.

Zu 6) Mit dem > Zeichen kannst du Ausgaben umleiten. Dabei gibt es aber mehrere Ausgabekanäle. 2> leitet alles, was über den "Fehlerkanal" ausgegeben wird um, alles andere wird weiterhin auf dem Bildschirm geschrieben.

Zu 1) Dann nutze doch einfach direkt das Screenshot-Tool, oder ging es mit dem nicht?

Zu 2) In einem Befehl sicherlich schwerlich, außer du schreibst dir ein entsprechendes Lese-Skript und liest die gewünschten Stellen direkt, statt sie mit dd zu kopieren.

Zu 4a) Einfach beim DD Befehl bs=3 statt bs=4 schreiben.


Zum Rest: Geht sicherlich, nur kann ich dir da aus dem Stegreif auch nicht weiter helfen.
 
  • Danke
Reaktionen: ka111
Ja es kamen viele Fragen auf :)

Achso, ok, das wusste ich nicht mit 2>.

Doch mit screencap ging es schon, ich nehm einfach das.

Wie meinst du ein Lese-Skript? ZB in einer while Schleife die immer zum nächsten Pixel springt und ausgibt? So ähnlich habe ich das jetzt auch gemacht.
Und ausserdem habe ich herausgefunden das es mit hexdump anstatt dd schneller geht bei mir, wenn man viele Pixel ausliest.

Und wie man mit hexdump in dezimal ausgibt habe ich in einem anderen Forum gefragt:

hexdump -v -e '16/1 "%03u " "\n"' /pfad/zur/datei

Das muss man aber vielleicht anpassen an seine Bedürfnisse, wie das geht weiss ich nicht...
Mit:

hexdump -vn 4 -s $(($((Breite.vom.Display*y+x+3))*4)) -e '16/1 "%03u " "\n"' /pfad/zur/datei

funktioniert es bei mir wie mit dd, (wenn ich das richtig gesehen habe).
Ich kann aber nicht garantieren dass das bei jedem funktioniert.
 

Ähnliche Themen

japanworm
Antworten
20
Aufrufe
566
Muki007
M
Skogtroll
  • Skogtroll
2
Antworten
23
Aufrufe
290
Rookie19
Rookie19
B
Antworten
9
Aufrufe
67
Buddelbaby
B
Zurück
Oben Unten