4 Draws a collage of colorized icons, with colors from colors.txt
5 Usage: ./draw-collage.py OUTFILE
8 from __future__ import division
15 from PIL import ImageChops
16 from PIL import ImageColor
17 from PIL import ImageDraw
18 from PIL import ImageFont
21 OUT_FILE = sys.argv[1]
23 COLOR_FILE = "colors.txt"
24 ICON_FILE = "icon.tga"
27 FONT_COLOR = ImageColor.getrgb("#ffffff")
28 FONT_FILE = io.BytesIO(base64.b64decode(b"""
29 d09GRgABAAAAAAUUAAwAAAAAB4gAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABPUy8yAAABkAAAAEMAAABg
30 JRUnJmNtYXAAAAHsAAAAMwAAADwAqwBwY3Z0IAAAAiAAAAAEAAAABAACAChnYXNwAAAFDAAAAAgAAAAI
31 //8AA2dseWYAAAJMAAAB+QAAA+a7QJukaGVhZAAAARwAAAA2AAAANg3su5RoaGVhAAABVAAAABsAAAAk
32 AGIAGGhtdHgAAAHUAAAAGAAAACwAaAAqbG9jYQAAAiQAAAAoAAAAKAi0CaRtYXhwAAABcAAAAB4AAAAg
33 AFgAT25hbWUAAARIAAAAqwAAATwTBjdRcG9zdAAABPQAAAAWAAAAIP/5AAUAAQAAAAEAAMM3GptfDzz1
34 AAsAQAAAAADXUDESAAAAANdcTRUAAgAAACAAMAAAAAgAAgAAAAAAAHjaY2BkYGBw+P8BSKowgIACUAQV
35 MAMARxECeQB42mNgZGBgEGaQY2BmAAEmIGYEizkw6IEEAAhTAKgAAHjaLcWBBYBAFADQ96ujgJsgh4M4
36 hAZomuZppIYKgAo9eAY1TgmLhvF/1st00gQgAKB8XFaH7bllu4wAVUMRLwuVBoIAeNpjUGFgYgABFSBm
37 YeAAYlyQAwAP7gCTeNpjYGBgAmJmIBYBkoxgmoVBA0izAWlGoKwlQ9r//0C+AUPi////L/9fAxQFAwCT
38 agkVAAACACgAAAAoACgAKABNAF8AfACdALMAzQDuAQABMAFRAXIBiwGjAbwB3QHzeNptU42OmkAQHj5m
39 AAkiAiv2Ynv2aMrFXlpSQsyPL63P01foGzRJZ27hpM3FldXNzverBH0RlXSikGL6fg3ox+UWM/3+eY3k
40 1+UWQj/SNbRjseNbHAV/LrfAzodxcN0wtijyLDud8JUUhRXvSC+KtiFHdB7PQ+PitmuG89i1caPfXcxS
41 ipQBCujiFKk8ia4IOAK7cBWuKKBEkfaKlHgU145tnKQRB6tjuHp51uPgjW1LNOgdo/B8sRscyxaoUYnu
42 +0qQgSUX5LycrIn83HifNgDeAWWpauCEWRzbuL1lzbyWBUI26VPK0VRyjqxmTtIHabg4/KNzc2dzrRtm
43 ot1B9RlHgZozDYcIC/xqylFdLcPkqEQVVnOSpXyOOFzpdGSxzqxzgoMOjueRDyWKZ06f5JGXfa21rY+v
44 PJ2vbNnaOO3M1hzzxDgvH4l/KncGJPbE+y4MV+EM3DAN0RsJoNLwIZdXI+sIOfCG8EWzawyhPw9jb0X1
45 jWv7rleUtleUSqe30gTWmtYcgeUxQnFH6ClWl2QlmYjOZ8iaX1UCZZ/JgzD20L4WnJ6xUQqnVHHbszhY
46 ZXDTff6fwVxav2awNWXsVen9rI9wAL3ryvxMHJ1ZVErLZm8/4aBGYfOyScF1Ckz/j0/Ue0+zRqV1iWxQ
47 oCi+CSPlA/0FDP9QAgAAAHjaVcwzQwQAAAXgL5tLWOKa3XqNWUvG2cafj8fp+WFITo+u3iHMU+ddhs3X
48 ebdxq3XeY9p2nfe2dfrMOqnz/jZ/zLjHOh/3KuZGUElQTlTKojNB1T99JiVty75rQWFFCW8d/qIt6zbd
49 C8rJi0pLNd1FAQGbTR1RUJBxbMOGDzlBbwqiSoI+pCUlpaXkrUvLCduQUfQuIerD51/nTVTKhpqgnLSN
50 //9vR8ImfAB42mNgZgCD/98YWIAUIwMaAAAu5AH+AAAAAAAB//8AAg==
54 (0.2500, 0.250), (0.2500, 1.375), (0.2500, 2.500), (0.2500, 3.625),
55 (0.8125, 4.750), (1.3750, 3.625), (1.3750, 2.500), (1.3750, 1.375),
56 (1.9375, 0.250), (2.5000, 1.375), (2.5000, 2.500), (2.5000, 3.625),
57 (3.0625, 4.750), (3.6250, 3.625), (3.6250, 2.500), (3.6250, 1.375),
58 (4.1875, 0.250), (4.7500, 1.375), (4.7500, 2.500), (4.7500, 3.625),
59 (5.3125, 4.750), (5.8750, 3.625), (5.8750, 2.500), (5.8750, 1.375),
66 with open(COLOR_FILE) as stream:
68 colors.append(line.split()[0])
71 font = ImageFont.truetype(FONT_FILE, FONT_SIZE)
72 icon = Image.open(ICON_FILE).convert("RGBA")
73 iconW, iconH = icon.size
75 # Prepare collage image
76 collage = Image.new("RGBA", (int(7.125*iconW), int(6.0*iconH)))
77 collageDraw = ImageDraw.Draw(collage)
80 for position, rgbString in zip(POSITIONS, colors):
82 x = int(position[0] * iconW)
83 y = int(position[1] * iconH)
86 addColor = ImageColor.getrgb("#" + rgbString + "00")
87 addImage = Image.new("RGBA", icon.size, addColor)
88 sumImage = ImageChops.add(icon, addImage)
90 collage.alpha_composite(sumImage, (x, y))
93 labelColor = ImageColor.getrgb("#" + rgbString + "ff")
94 textW, textH = collageDraw.textsize(rgbString, font)
97 labelX = x + (iconW - labelW) // 2
98 labelY = y + iconH - (labelH // 2)
99 labelRect = (labelX, labelY, labelX + labelW, labelY + labelH)
100 textPos = (labelX + 3, labelY)
102 collageDraw.rectangle(labelRect, labelColor)
103 collageDraw.text(textPos, rgbString, FONT_COLOR, font)
105 collage.save(OUT_FILE)