This is what exactly you do in photoshop with colorize check
from PIL import Image
import colorsys
def rgbLuminance(r, g, b):
luminanceR = 0.22248840
luminanceG = 0.71690369
luminanceB = 0.06060791
return (r * luminanceR) + (g * luminanceG) + (b * luminanceB)
def colorize(im, h, s, l_adjust):
h /= 360.0
s /= 100.0
l_adjust /= 100.0
result = Image.new('RGBA', im.size)
pixin = im.load()
pixout = result.load()
for y in range(im.size[1]):
for x in range(im.size[0]):
currentR = pixin[x, y][0]/255
currentG = pixin[x, y][1]/255
currentB = pixin[x, y][2]/255
lum = rgbLuminance(currentR, currentG, currentB)
if l_adjust > 0:
lum = lum * (1 - l_adjust)
lum = lum + (1.0 - (1.0 - l_adjust))
else:
lum = lum * (l_adjust + 1)
l = lum
r, g, b = colorsys.hls_to_rgb(h, l, s)
r, g, b = int(r * 255.99), int(g * 255.99), int(b * 255.99)
pixout[x, y] = (r, g, b, 255)
return result