Pixefarbe auslesen

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
Peak_me
User
Beiträge: 92
Registriert: Sonntag 27. Januar 2008, 03:09

Hallo!

Kann man in Python die Farbe eines Bildschirmpixels auslesen?

Für Delphi habe ich folgendes gefunden:

procedure TForm1.Button1Click(Sender: TObject);
var
dc: hDc;
begin
dc := GetDC(0);
Color := GetPixel(dc, x, y);
ReleaseDC(0, dc);
end;


Danke schonmal!,
Gruß
peak
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Was für ein Pixel soll es denn sein? Von einem Fenster? Von einem Bild? Irgend einen Pixel des Desktops?
Peak_me
User
Beiträge: 92
Registriert: Sonntag 27. Januar 2008, 03:09

Spielt das eine Rolle?
Ich möchte die Farbe eines derzeit aktiven Pixels des Bildschirms auslesen. Wenn ich den Pixel innerhalb einer Anwendung haben will, dann passe ich halt die Koordinaten entsprechend an.
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

Peak_me hat geschrieben:Spielt das eine Rolle?
Würde er sonst fragen?
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

Mit PIL geht das.

Code: Alles auswählen

from PIL import Image

img = Image.open("pfad")
imgload = img.load()
# x, y steht für die koordinaten und gibt die farbe als zahl zurück
imgload[x, y]
Mit PIL kann man auch "Screenshots" machen (wenn ich mich richtig erinnere), so kann man dann auch den Bildschirm auslesen.
Einfach mal die Dokumentation von PIL lesen.

http://www.pythonware.com/products/pil/
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

Andere Idee:

Du kannst auch von wxPython (GUI-Toolkit) den vorgefertigten
wx.ColourDialog nutzen.

siehe dazu (sehr große HTML Seite einen Moment Geduld ;-) ):
http://wiki.wxpython.org/AnotherTutoria ... 8ea4ed8f85
Peak_me
User
Beiträge: 92
Registriert: Sonntag 27. Januar 2008, 03:09

Danke an alle!
Es funktioniert jetzt.

Screenshot:

Code: Alles auswählen

import os
import sys
import time
import Image
import ImageGrab

SaveDirectory=r'C:\Dokumente und Einstellungen\Besitzer\Desktop'
ImageEditorPath=r'C:\WINDOWS\system32\mspaint.exe'

img=ImageGrab.grab()
saveas=os.path.join(SaveDirectory,'ScreenShot.png')
img.save(saveas)
editorstring='""%s" "%s"'% (ImageEditorPath,saveas) 
os.system(editorstring)
Farbe auslesen:

Code: Alles auswählen

from PIL import Image

img = Image.open('C:\Dokumente und Einstellungen\Besitzer\Desktop\Screenshot.png') 
imgload = img.load()
x=8
y=8
Farbe=img.getpixel((x,y))
print Farbe
Peak_me
User
Beiträge: 92
Registriert: Sonntag 27. Januar 2008, 03:09

Ich habe aber noch ein Problem:
Nach dem Screenshot-Programm geht Paint auf und bleibt auch offen!
Egal was ich versuche, ich kriege es danach nicht wieder geschlossen...
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Verwendest Du denn Paint überhaupt? Falls ja, kannst Du es ja auch mit der Maus schließen. Ansonsten lass doch den Aufruf von Paint einfach weg. Für den Screenshot sollte das hier doch vollkommen ausreichen:

Code: Alles auswählen

import ImageGrab
ImageGrab.grab().save('C:\\path\\ScreenShot.png')
Ansonsten schau Dir mal PEP8 an: Leerzeichen um '=' und nach ',', Namenskonventionen (save_directory oder besser noch SAVE_DIRECTORY). Ein doppeltes Anführungszeichen in Zeile 13 dürfte zu viel sein.
MfG
HWK
Peak_me
User
Beiträge: 92
Registriert: Sonntag 27. Januar 2008, 03:09

Jo, du hast recht; was soll das Paint eigentlich -.-
So gehts auch viel schneller!
Bastl
User
Beiträge: 9
Registriert: Montag 13. November 2006, 11:52

Mir ist noch eine Kleinigkeit aufgefallen.
Ich glaube das du mit der Funktion

Code: Alles auswählen

imgload = img.load()
ein Array erzeugst und auf das du dann mit

Code: Alles auswählen

farbe = imgload[x, y]
zugreifen kannst.
Damit kannst du dir den getpixel Aufruf sparen. Der kostet nämlich mehr Zeit. Steht glaub ich auch so in der Doku.
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

Peak_me hat geschrieben: Farbe auslesen:

Code: Alles auswählen

from PIL import Image

img = Image.open('C:\Dokumente und Einstellungen\Besitzer\Desktop\Screenshot.png') 
imgload = img.load()
x=8
y=8
Farbe=img.getpixel((x,y))
print Farbe
In dem Code oben ist ``imgload`` unnötig es wird eh nicht benutzt.
Generell gibt es zwei Varianten:

Code: Alles auswählen

from PIL import Image

def variante1():
    img = Image.open(r"C:\Users\Sr4l\DreamInCode\Python\ImageDiffer\0.bmp") 
    farbe = img.getpixel((8, 8))
    return farbe

def variante2():
    img = Image.open(r"C:\Users\Sr4l\DreamInCode\Python\ImageDiffer\0.bmp") 
    imgload = img.load()
    farbe = imgload[8, 8]
    return farbe
Variante 1 und 2 sind fast gleich schnell, zumindest bei meinen Tests.
Variante 2 ist bei mir immer leicht schneller und zwar unwichtige ~1-2%.
Bastl
User
Beiträge: 9
Registriert: Montag 13. November 2006, 11:52

Variante 2 wird aber viel schneller wenn die Funktionalität mehrfach benötigt wird.
So zumindest meine Erfahrung.
Wenn nur der eine Pixel interessiert ists wohl egal.
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

Bastl hat geschrieben:Variante 2 wird aber viel schneller wenn die Funktionalität mehrfach benötigt wird.
So zumindest meine Erfahrung.
Wenn nur der eine Pixel interessiert ists wohl egal.
Das habe ich vermutet aber ich habe in die Zeitmessung das öffnen der Datei mit einbezogen und das macht bei unter 100 Pixelabfragen den größten Teil aus.

Bei mehr als 10 000 Pixelabfragen ist Variante 2 8x schneller als Variante 1, bei 50 000 12x.

Ist mir aber auch egal ich habe bisher immer Variante 2 genutzt ;-)
jtk
User
Beiträge: 37
Registriert: Montag 19. November 2007, 17:16

Ich kann ImageGrab nicht importieren. Wieso?
>>> import ImageGrab
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.5/site-packages/PIL/ImageGrab.py", line 34, in <module>
import _grabscreen
ImportError: No module named _grabscreen

>>>
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

jtk hat geschrieben:Ich kann ImageGrab nicht importieren. Wieso?
Weil es ImageGrab nur für Windows gibt.
jtk
User
Beiträge: 37
Registriert: Montag 19. November 2007, 17:16

"Weil es ImageGrab nur für Windows gibt"
Wie kann man das dann bei Linux machen?[/quote]
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

derdon, ImageGrab ist doch aus der PIL?!
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

jtk hat geschrieben:Wie kann man das dann bei Linux machen?
Das frog-Modul hat eine Methode snapshot(). Da sind zwei unterschiedliche Möglichkeiten für Linux implementiert. Ein Blick in den Quelltext sollte helfen.
Antworten