使用Python中的PIL绘制圆形渐变

Jav*_*oxs 6 python image python-imaging-library

我正在使用Python创建图像

myImage = Image.new('RGB', (250, 250), 'rgb(155,89,182)')
Run Code Online (Sandbox Code Playgroud)

这实际上创造了图像.但有没有办法创建一个图像,背景为我选择的颜色,但有渐变?我想选择蓝色作为我的颜色,然后,我希望边缘呈深蓝色,图像中心呈浅蓝色.这可能使用简单的PIL和Python吗?

先感谢您.

Leo*_*aum 12

代码取决于您希望渐变的外观.

您可以将其设为矩形渐变,如下所示:

矩形渐变

或者你可以把它变成这样的圆形渐变:

圆形渐变

这将是圆形渐变的代码:

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')
Run Code Online (Sandbox Code Playgroud)

对于每个像素,它将红色,绿色和蓝色值设置在介于两者之间的某个位置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')
Run Code Online (Sandbox Code Playgroud)

这种方法的工作方式相同,只是它测量到最近边缘的距离,而不是中心.