Seite 1 von 1

Pixefarbe auslesen

Verfasst: Freitag 4. April 2008, 20:26
von Peak_me
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

Verfasst: Freitag 4. April 2008, 21:36
von Hyperion
Was für ein Pixel soll es denn sein? Von einem Fenster? Von einem Bild? Irgend einen Pixel des Desktops?

Verfasst: Samstag 5. April 2008, 17:17
von Peak_me
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.

Verfasst: Samstag 5. April 2008, 17:47
von audax
Peak_me hat geschrieben:Spielt das eine Rolle?
Würde er sonst fragen?

Verfasst: Samstag 5. April 2008, 19:14
von Sr4l
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/

Verfasst: Samstag 5. April 2008, 19:47
von Sr4l
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

Verfasst: Sonntag 6. April 2008, 00:05
von Peak_me
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

Verfasst: Sonntag 6. April 2008, 00:17
von Peak_me
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...

Verfasst: Sonntag 6. April 2008, 10:19
von HWK
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

Verfasst: Sonntag 6. April 2008, 11:28
von Peak_me
Jo, du hast recht; was soll das Paint eigentlich -.-
So gehts auch viel schneller!

Verfasst: Montag 7. April 2008, 08:33
von Bastl
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.

Verfasst: Montag 7. April 2008, 17:06
von Sr4l
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%.

Verfasst: Montag 7. April 2008, 17:49
von Bastl
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.

Verfasst: Montag 7. April 2008, 18:19
von Sr4l
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 ;-)

Verfasst: Freitag 23. Januar 2009, 17:20
von jtk
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

>>>

Verfasst: Freitag 23. Januar 2009, 17:27
von Leonidas
jtk hat geschrieben:Ich kann ImageGrab nicht importieren. Wieso?
Weil es ImageGrab nur für Windows gibt.

Verfasst: Freitag 23. Januar 2009, 17:40
von jtk
"Weil es ImageGrab nur für Windows gibt"
Wie kann man das dann bei Linux machen?[/quote]

Verfasst: Freitag 23. Januar 2009, 17:43
von derdon

Verfasst: Freitag 23. Januar 2009, 17:45
von Leonidas
derdon, ImageGrab ist doch aus der PIL?!

Verfasst: Freitag 23. Januar 2009, 18:21
von numerix
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.