-
Notifications
You must be signed in to change notification settings - Fork 29
/
Copy pathwal.py
120 lines (96 loc) · 3.15 KB
/
wal.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
"""
Generate a colorscheme using imagemagick.
"""
import logging
import re
import shutil
import subprocess
import sys
from .. import colors
from .. import util
def imagemagick(color_count, img, magick_command):
"""Call Imagemagick to generate a scheme."""
flags = [
"-resize",
"25%",
"-colors",
str(color_count),
"-unique-colors",
"txt:-",
]
img += "[0]"
try:
output = subprocess.check_output(
[*magick_command, img, *flags], stderr=subprocess.STDOUT
).splitlines()
except subprocess.CalledProcessError as Err:
logging.error("Imagemagick error: %s", Err)
logging.error(
"IM 7 disables stdout by default, check the wiki for the fix."
)
sys.exit(1)
return output
def has_im():
"""Check to see if the user has im installed."""
if shutil.which("magick"):
return ["magick", "convert"]
if shutil.which("convert"):
return ["convert"]
logging.error("Imagemagick wasn't found on your system.")
logging.error("Try another backend. (wal --backend)")
sys.exit(1)
def try_gen_in_range(img, magick_command):
for i in range(0, 20, 1):
raw_colors = imagemagick(16 + i, img, magick_command)
if len(raw_colors) > 16:
break
if i == 19:
logging.error("Imagemagick couldn't generate a suitable palette.")
sys.exit(1)
else:
logging.warning("Imagemagick couldn't generate a palette.")
logging.warning("Trying a larger palette size %s", 16 + i)
return raw_colors
def gen_colors(img):
"""Format the output from imagemagick into a list
of hex colors."""
magick_command = has_im()
raw_colors = try_gen_in_range(img, magick_command)
try:
out = [re.search("#.{6}", str(col)).group(0) for col in raw_colors[1:]]
except AttributeError:
if magick_command == ["magick", "convert"]:
logging.warning("magick convert failed, using only magick")
magick_command = ["magick"]
raw_colors = try_gen_in_range(img, magick_command)
out = [
re.search("#.{6}", str(col)).group(0) for col in raw_colors[1:]
]
return out
def adjust(cols, light, **kwargs):
"""Adjust the generated colors and store them in a dict that
we will later save in json format.
:keyword-args:
- c16: use 16 colors through specified method - [ "lighten" | "darken" ]
"""
if "c16" in kwargs:
cols16 = kwargs["c16"]
else:
cols16 = False
raw_colors = cols[:1] + cols[8:16] + cols[8:-1]
return colors.generic_adjust(raw_colors, light, c16=cols16)
def get(img, light=False, **kwargs):
"""Get colorscheme.
:keyword-args:
- c16: use 16 colors through specified method - [ "lighten" | "darken" ]
"""
if "c16" in kwargs:
cols16 = kwargs["c16"]
else:
cols16 = False
colors = gen_colors(img)
# it is possible we could have picked garbage data
garbage = "# Image"
if garbage in colors:
colors.remove(garbage)
return adjust(colors, light, c16=cols16)