Bläddra i källkod

Get rid of PIL, do HSV conversion in pure Python instead

Taddeus Kroes 5 år sedan
förälder
incheckning
1c46685d1a
1 ändrade filer med 34 tillägg och 6 borttagningar
  1. 34 6
      interaction.py

+ 34 - 6
interaction.py

@@ -5,7 +5,6 @@ sys.path.insert(0, join(dirname(__file__), 'python-xlib'))
 import time
 from random import randint
 from Xlib import display, X, XK, ext
-from PIL import Image
 
 
 WINDOW_WIDTH = 1600
@@ -49,11 +48,9 @@ def focus_window(window):
 
 
 def screenshot_board(window):
-    raw = window.get_image(BOARD_X, BOARD_Y, BOARD_WIDTH, BOARD_HEIGHT,
-                           X.ZPixmap, 0xffffffff)
-    dim = BOARD_WIDTH, BOARD_HEIGHT
-    im = Image.frombytes('RGB', dim, raw.data, 'raw', 'BGRX')
-    return im.convert('HSV')
+    im = window.get_image(BOARD_X, BOARD_Y, BOARD_WIDTH, BOARD_HEIGHT,
+                          X.ZPixmap, 0xffffffff)
+    return BoardImage(im.data)
 
 
 def press_keys(window, keys):
@@ -71,8 +68,39 @@ def press_keys(window, keys):
         time.sleep(KEY_DELAY / 1000)
 
 
+def rgb2hsv(r, g, b):
+    r /= 255
+    g /= 255
+    b /= 255
+    cmax = max(r, g, b)
+    cmin = min(r, g, b)
+    diff = cmax - cmin
 
+    if cmax == cmin:
+        h = 0
+    elif cmax == r:
+        h = (60 * ((g - b) / diff) + 360) % 360
+    elif cmax == g:
+        h = (60 * ((b - r) / diff) + 120) % 360
+    elif cmax == b:
+        h = (60 * ((r - g) / diff) + 240) % 360
 
+    h = int(h * 256 / 360)
+    s = 0 if cmax == 0 else int(diff * 256 / cmax)
+    v = int(cmax * 256)
+
+    return h, s, v
+
+
+class BoardImage:
+    def __init__(self, data):
+        self.data = data
+
+    def getpixel(self, xy):
+        x, y = xy
+        i = (y * BOARD_WIDTH + x) * 4
+        b, g, r = self.data[i:i + 3]
+        return rgb2hsv(r, g, b)
 
 
 if __name__ == '__main__':