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

时间:2015-06-02 23:00:34

标签: python image python-imaging-library

我正在使用Python创建图像,使用

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

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

提前谢谢你。

3 个答案:

答案 0 :(得分:11)

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

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

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

对于每个像素,它会根据像素到中心的距离将{,1}}和innerColor之间的红色,绿色和蓝色值设置在某处。

这将是矩形渐变的代码:

outerColor

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

答案 1 :(得分:1)

制作一条弧线ax + by + c = 0

a = -0.5
b = -1
c = 250
width = 55

imgsize = (180, 320) #The size of the image
image = PIL.Image.new('RGB', imgsize, color="white") #Create the image

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

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

        dist = (a*x + b*y + c)/np.sqrt(a*a+b*b)
        color_coef = abs(dist)/width

        if abs(dist) < width:
            red = outerColor[0] * color_coef + innerColor[0] * (1 - color_coef)
            green = outerColor[1] * color_coef + innerColor[1] * (1 - color_coef)
            blue = outerColor[2] * color_coef + innerColor[2] * (1 - color_coef)

            image.putpixel((x, y), (int(red), int(green), int(blue)))

image.save('linegradient.jpg')

NixPkgs

答案 2 :(得分:1)

如果他们向我提供 x、y 中的梯度数据,我会怎么做。这不是中心。

这是他们给我的所有数据:

Spotlight_Size  90.81163
RefractionDepthBias:    0
GradientPOSX:   50
GradientPOSY:   99.68244
GradientSIZE:   121.87289
Spotlight_Intensity:    105
Spotlight_PoSX: 50.192413
Spotlight_PosY: 52.344917
FallOffColor_Fill_Percent:  40
FallOffColor_Postion: 50

和 3 种颜色:

A_COLOR:100600ff
B_COLOR: f7d32aff
FallOff_COLOR: f7d32aff