Drop lots of legacy code. Support Python 3.7-3.11.
[librarian.git] / src / librarian / covers / utils / color.py
1 # This file is part of Librarian, licensed under GNU Affero GPLv3 or later.
2 # Copyright © Fundacja Wolne Lektury. See NOTICE for more information.
3 #
4 def luminance(rgb):
5     rgb = [
6         c / 255 
7         for c in rgb
8     ]
9     rgb = [
10         c / 12.92 if c < .03928 else ((c + .055) / 1.055) ** 2.4
11         for c in rgb
12     ]
13     return .2126 * rgb[0] + .7152 * rgb[1] + .0722 * rgb[2]
14
15
16 def cdist(a, b):
17     d = abs(a-b)
18     if d > 128:
19         d = 256 - d
20     return d
21
22
23 def algo_contrast_or_hue(img, colors):
24     rgb = img.convert('RGB').resize((1, 1)).getpixel((0, 0))
25     lumi = luminance(rgb)
26
27     if lumi > .9:
28         return colors[3]
29     elif lumi < .1:
30         return colors[2]
31
32     hue = img.convert('HSV').resize((1, 1)).getpixel((0, 0))[0]
33     return max(
34         colors[:3],
35         key=lambda c: cdist(hue, c['hsv'][0]) ** 2 + (lumi - c['luminance']) ** 2
36     )
37
38
39 def is_very_bright(img):
40     rgb = img.convert('RGB').getpixel((0, 0))
41     lumi = luminance(rgb)
42     return lumi > .95