2015-06-02 289 views
3

我實際上是使用Python創建圖像的基礎知識。事情是,我實際上使用在Python中使用PIL繪製漸變

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') 

對於每個像素,它設置紅色,綠色和取決於從像素到中心的距離,在innerColorouterColor之間的某個位置處的藍色值。

這將是矩形梯度的代碼:

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