diff options
Diffstat (limited to 'ratpoison/py')
| -rw-r--r-- | ratpoison/py/color_detect.py | 108 | ||||
| -rw-r--r-- | ratpoison/py/colorz.py | 71 | 
2 files changed, 0 insertions, 179 deletions
diff --git a/ratpoison/py/color_detect.py b/ratpoison/py/color_detect.py deleted file mode 100644 index 30661f8..0000000 --- a/ratpoison/py/color_detect.py +++ /dev/null @@ -1,108 +0,0 @@ -import sys -import colorsys -from colorz import colorz -from math import sqrt - -try: -    import Image -except ImportError: -    from PIL import Image - -if len(sys.argv) < 2: -  print "Usage: {0} FILENAME [num_colors]".format(sys.argv[0]) -  sys.exit() - - -print sys.argv[1] - -WALLPAPER = sys.argv[1] -filename = WALLPAPER.split('/').pop() -COLORS = ".{0}.colors".format(filename) -XRESOURCES = ".{0}.Xres".format(filename) -SAMPLE = ".{0}.sample.png".format(filename) - -cols = '' -xres = '' - -def torgb(hexv): -    hexv = hexv[1:] -    r, g, b = ( -        int(hexv[0:2], 16) / 256.0, -        int(hexv[2:4], 16) / 256.0, -        int(hexv[4:6], 16) / 256.0, -    ) -    return r, g, b - -def normalize(hexv, minv=128, maxv=256): -    r, g, b = torgb(hexv) -    h, s, v = colorsys.rgb_to_hsv(r, g, b) -    minv = minv / 256.0 -    maxv = maxv / 256.0 -    if v < minv: -        v = minv -    if v > maxv: -        v = maxv -    r, g, b = colorsys.hsv_to_rgb(h, s, v) -    return '#{:02x}{:02x}{:02x}'.format(int(r * 256), int(g * 256), int(b * 256)) - -def darkness(hexv): -  r, g, b = torgb(hexv) -  darkness = sqrt((255 - r) ** 2 + (255 - g) ** 2 + (255 - b) ** 2) -  return darkness - -def to_hsv(c): -    r, g, b = torgb(c) -    h, s, v = colorsys.rgb_to_hsv(r, g, b) -    return h, s, v - -def hex_color_to_rgb(color): -    color = color[1:] if color[0]=="#" else color -    return ( -        int(color[:2], 16), -        int(color[2:4], 16), -        int(color[4:], 16) -        ) - -def create_sample(f, colors): -    im = Image.new("RGB", (1000, 100), "white") -    pix = im.load() - -    width_sample = im.size[0]/len(colors) - -    for i, c in enumerate(colors): -        for j in range(width_sample*i, width_sample*i+width_sample): -            for k in range(0, 100): -                pix[j, k] = hex_color_to_rgb(c) - -    im.save(f) - -if __name__ == '__main__': -    if len(sys.argv) == 2: -        n = 16 -    else: -        n = int(sys.argv[2]) - - -    i = 0 -    # sort by value, saturation, then hue -    colors = colorz(WALLPAPER, n=n) -    colors.sort(key=lambda  x:darkness(x), reverse=True) -    for c in colors: -        if i == 0: -            c = normalize(c, minv=0, maxv=32) -        elif i == 8: -            c = normalize(c, minv=128, maxv=192) -        elif i < 8: -            c = normalize(c, minv=160, maxv=224) -        else: -            c = normalize(c, minv=200, maxv=256) -        c = normalize(c, minv=32, maxv=224) -        xres += """*color{}: {}\n""".format(i, c) -        cols += """export COLOR{}="{}"\n""".format(i, c) -        i += 1 - -    create_sample(SAMPLE, colors) -    with open(XRESOURCES, 'w') as f: -        f.write(xres) -    with open(COLORS, 'w') as f: -        f.write(cols) diff --git a/ratpoison/py/colorz.py b/ratpoison/py/colorz.py deleted file mode 100644 index 8c00f0c..0000000 --- a/ratpoison/py/colorz.py +++ /dev/null @@ -1,71 +0,0 @@ -from collections import namedtuple -from math import sqrt -import random -try: -    import Image -except ImportError: -    from PIL import Image - -Point = namedtuple('Point', ('coords', 'n', 'ct')) -Cluster = namedtuple('Cluster', ('points', 'center', 'n')) - -def get_points(img): -    points = [] -    w, h = img.size -    for count, color in img.getcolors(w * h): -        points.append(Point(color, 3, count)) -    return points - -rtoh = lambda rgb: '#%s' % ''.join(('%02x' % p for p in rgb)) - -def colorz(filename, n=3): -    img = Image.open(filename) -    img.thumbnail((200, 200)) -    w, h = img.size - -    points = get_points(img) -    clusters = kmeans(points, n, 1) -    rgbs = [map(int, c.center.coords) for c in clusters] -    return map(rtoh, rgbs) - -def euclidean(p1, p2): -    return sqrt(sum([ -        (p1.coords[i] - p2.coords[i]) ** 2 for i in range(p1.n) -    ])) - -def calculate_center(points, n): -    vals = [0.0 for i in range(n)] -    plen = 0 -    for p in points: -        plen += p.ct -        for i in range(n): -            vals[i] += (p.coords[i] * p.ct) -    return Point([(v / plen) for v in vals], n, 1) - -def kmeans(points, k, min_diff): -    clusters = [Cluster([p], p, p.n) for p in random.sample(points, k)] - -    while 1: -        plists = [[] for i in range(k)] - -        for p in points: -            smallest_distance = float('Inf') -            for i in range(k): -                distance = euclidean(p, clusters[i].center) -                if distance < smallest_distance: -                    smallest_distance = distance -                    idx = i -            plists[idx].append(p) - -        diff = 0 -        for i in range(k): -            old = clusters[i] -            center = calculate_center(plists[i], old.n) -            new = Cluster(plists[i], center, old.n) -            clusters[i] = new -            diff = max(diff, euclidean(old.center, new.center)) - -        if diff < min_diff: -            break - -    return clusters  | 
