Итак, плохая новость в том, что PIL не может этого сделать. Ниже приводятся несколько идей, к сожалению, ни одна из которых не является простой.
GIMP (GNU Image Manipulation Program) имеет потрясающий плагин "ligthning effect",
GIMP допускает использование сценариев в Python, и его можно вызывать параметрически.
Недостатком является то, что ваш плагин должен иметь урну из процесса GIMP. (Таким образом, вы либо запускаете GIMP как пакет на один раз, либо вам необходимо разработать подключаемый модуль Python для сервера, который обрабатывает ваши изображения с помощью подключаемого модуля световых эффектов)
Другой вариант, с которым я знаком, также включает в себя внепроцессный рендеринг: использовать POVRay: визуализировать ваше изображение в качестве пигментной карты для плоской плиты размером 1x1x0,1, а затем вы можете разместить вокруг себя «настоящие» источники света.
Другой способ - использовать OpenGL самостоятельно - я немного просмотрел darond, и, возможно, этот «глянцевый» проект может предоставить вам возможность использовать источники света без единого мнения, чтобы спуститься в низкоуровневый opengl:
http://www.tuxradar.com/gloss
Или - «подделать» его с помощью прямоугольной сетки из черных и белых прямоугольников, которую вы комбинируете со своим умножением цветов.
Это единственный способ, который позволил бы вам использовать только PIL, но линии «сетки» слишком видимы, и я думаю, что попытка сглаживания с размытием не обрезала бы это:
def fake_light(image, tilesize=50):
WIDTH, HEIGHT = i.size
for x in xrange(0, WIDTH, tilesize):
for y in xrange(0, HEIGHT, tilesize):
br = int(255 * (1 - x / float(WIDTH) * y /float(HEIGHT)))
tile = Image.new("RGBA", (tilesize, tilesize), (255,255,255,128))
image.paste((br,br,br), (x, y, x + tilesize, y + tilesize), mask=tile)