2015-06-02 3 views
3

Я на самом деле создаю изображения, используя основы Python. Дело в том, что я фактически используюГрадиенты графа с использованием PIL в Python

myImage = Image.new('RGB', (250, 250), 'rgb(155,89,182)') 

и хорошо, это фактически создает изображение. Но есть ли способ создать изображение с фоном цвета, который я выбираю, но с градиентами? Позвольте мне объяснить немного больше, я хочу выбрать синий как мой цвет, затем, я хочу глубокий синий по краям и больше светло-голубой в центре изображения. Возможно ли использование простых PIL и Python? Спасибо заранее.

ответ

5

Код зависит от того, как вы хотите, чтобы градиент выглядел.

Вы можете сделать это прямоугольный градиент, который будет выглядеть следующим образом:

A rectangular gradient

Или вы могли бы сделать это круглый градиент так:

A round gradient

Это будет код для круглый градиент:

import Image 
import math 

imgsize = (250, 250) #The size of the image 

image = Image.new('RGB', imgsize) #Create the image 

innerColor = [80, 80, 255] #Color at the center 
outerColor = [0, 0, 80] #Color at the corners 


for y in range(imgsize[1]): 
    for x in range(imgsize[0]): 

     #Find the distance to the center 
     distanceToCenter = math.sqrt((x - imgsize[0]/2) ** 2 + (y - imgsize[1]/2) ** 2) 

     #Make it on a scale from 0 to 1 
     distanceToCenter = float(distanceToCenter)/(math.sqrt(2) * imgsize[0]/2) 

     #Calculate r, g, and b values 
     r = outerColor[0] * distanceToCenter + innerColor[0] * (1 - distanceToCenter) 
     g = outerColor[1] * distanceToCenter + innerColor[1] * (1 - distanceToCenter) 
     b = outerColor[2] * distanceToCenter + innerColor[2] * (1 - distanceToCenter) 


     #Place the pixel   
     image.putpixel((x, y), (int(r), int(g), int(b))) 

image.save('circlegradient.jpg') 

Для каждого пикселя он устанавливает красный, зеленый и голубые значения где-то между innerColor и outerColor в зависимости от расстояния от пикселя до центра.

Это будет код для прямоугольного градиента:

import Image 

imgsize = (250, 250) #The size of the image 

image = Image.new('RGB', imgsize) #Create the image 

innerColor = [80, 80, 255] #Color at the center 
outerColor = [0, 0, 80] #Color at the edge 


for y in range(imgsize[1]): 
    for x in range(imgsize[0]): 

     #Find the distance to the closest edge 
     distanceToEdge = min(abs(x - imgsize[0]), x, abs(y - imgsize[1]), y) 

     #Make it on a scale from 0 to 1 
     distanceToEdge = float(distanceToEdge)/(imgsize[0]/2) 

     #Calculate r, g, and b values 
     r = innerColor[0] * distanceToEdge + outerColor[0] * (1 - distanceToEdge) 
     g = innerColor[1] * distanceToEdge + outerColor[1] * (1 - distanceToEdge) 
     b = innerColor[2] * distanceToEdge + outerColor[2] * (1 - distanceToEdge) 


     #Place the pixel   
     image.putpixel((x, y), (int(r), int(g), int(b))) 

image.save('rectgradient.jpg') 

Это работает точно так же, за исключением того, что измеряет расстояние до ближайшего края, а не в центре.

+0

Большое вам спасибо! Это тот ответ, который я искал! :) – Javittoxs

Смежные вопросы