Как создать прозрачный радиальный градиент с помощью python? - PullRequest
1 голос
/ 27 мая 2020

Я пытаюсь создать радиальный градиент, переходящий в чистый фон. Моя цель - создать этот градиент и вставить его в качестве фона для другого изображения.

До сих пор я мог создать круговой градиент, но он не был прозрачным. Я нашел приведенный ниже код в stackoverflow:

imgsize=(650,650)
image = Image.new('RGBA', imgsize)
innerColor = [153,0,0]
for y in range(imgsize[1]):
    for x in range(imgsize[0]):
         distanceToCenter = math.sqrt((x - imgsize[0]/2) ** 2 + (y - imgsize[1]/2) ** 2)
         distanceToCenter = float(distanceToCenter) / (math.sqrt(2) * imgsize[0]/2)
         r = distanceToCenter + innerColor[0] * (1 - distanceToCenter)
         g =  distanceToCenter + innerColor[1] * (1 - distanceToCenter)
         b =  distanceToCenter + innerColor[2] * (1 - distanceToCenter)
         image.putpixel((x, y), (int(r), int(g), int(b)))

это изображение, которое создается я бы хотел, чтобы оно не становилось черным, а вместо этого очищалось.

спасибо за помощь :)

Ответы [ 2 ]

1 голос
/ 28 мая 2020

Думаю, я бы просто нарисовал ваш solid красный и вычислил слой прозрачности с Numpy и pu sh в:

#!/usr/bin/env python3

import numpy as np
from PIL import Image

# Define width and height of image
W, H = 650, 650

# Create solid red image
im = Image.new(mode='RGB', size=(W,H), color=(153,0,0))

# Create radial alpha/transparency layer. 255 in centre, 0 at edge
Y = np.linspace(-1, 1, H)[None, :]*255
X = np.linspace(-1, 1, W)[:, None]*255
alpha = np.sqrt(X**2 + Y**2)
alpha = 255 - np.clip(0,255,alpha)

# Push that radial gradient transparency onto red image and save
im.putalpha(Image.fromarray(alpha.astype(np.uint8)))
im.save('result.png')

enter image description here

Ключевые слова : Python, обработка изображений, радиальный градиент, альфа, прозрачность.

1 голос
/ 27 мая 2020

Это простая математика: белый / непрозрачный - 255, поэтому вам нужно i -ое измерение равным innerColor[i] + distanceToCenter * (255 - innerColor[i]) и добавить параметр прозрачности к кортежу пикселей int((1 - distanceToCenter) * 255):

imgsize=(650,650)
image = Image.new('RGBA', imgsize)
innerColor = [153,0,0]
for y in range(imgsize[1]):
    for x in range(imgsize[0]):
         distanceToCenter = math.sqrt((x - imgsize[0]/2) ** 2 + (y - imgsize[1]/2) ** 2)
         distanceToCenter = float(distanceToCenter) / (math.sqrt(2) * imgsize[0]/2)
         r =  innerColor[0] + distanceToCenter * (255 - innerColor[0])
         g =  innerColor[1] + distanceToCenter * (255 - innerColor[1])
         b =  innerColor[2] + distanceToCenter * (255 - innerColor[2])
         # Or just 
         # r = innerColor[0]
         # g = innerColor[1]
         # b = innerColor[2]
         # if not blending with white as you get farther away from the center.
         image.putpixel((x, y), (int(r), int(g), int(b), int((1 - distanceToCenter) * 255)))

Результат:

enter image description here

...