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

Pixefarbe auslesen

Beitragvon Peak_me » Freitag 4. April 2008, 20:26

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: 7471
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Beitragvon Hyperion » Freitag 4. April 2008, 21:36

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

Beitragvon Peak_me » Samstag 5. April 2008, 17:17

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

Beitragvon audax » Samstag 5. April 2008, 17:47

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:

Beitragvon Sr4l » Samstag 5. April 2008, 19:14

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:

Beitragvon Sr4l » Samstag 5. April 2008, 19:47

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

Beitragvon Peak_me » Sonntag 6. April 2008, 00:05

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

Beitragvon Peak_me » Sonntag 6. April 2008, 00:17

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

Beitragvon HWK » Sonntag 6. April 2008, 10:19

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

Beitragvon Peak_me » Sonntag 6. April 2008, 11:28

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

Beitragvon Bastl » Montag 7. April 2008, 08:33

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

[code=]imgload = img.load()[/code]

ein Array erzeugst und auf das du dann mit

[code=]farbe = imgload[x, y][/code]

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:

Beitragvon Sr4l » Montag 7. April 2008, 17:06

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

Beitragvon Bastl » Montag 7. April 2008, 17:49

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:

Beitragvon Sr4l » Montag 7. April 2008, 18:19

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

Beitragvon jtk » Freitag 23. Januar 2009, 17:20

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

>>>

Wer ist online?

Mitglieder in diesem Forum: Bing [Bot], Google [Bot]