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
ein Array erzeugst und auf das du dann mit
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.