Python 3.7 + PIL Как изменить затенение пикселей на эквивалентный уровень прозрачности альфа 0-255 - PullRequest
1 голос
/ 02 ноября 2019

Невозможно понять, как преобразовать список цветов пикселей в эквивалентную альфа-прозрачность белого цвета.

pixel_data = list(img.getdata())
print(pixel_data)
alpha_range = range(0, 256)  # increase count
color_range = range(256, -1, -1)  # decrease count
for i, pixel in enumerate(pixel_data):
    if pixel[:3] == (255, 255, 255):
        pixel_data[i] = (255, 255, 255, 0)
img.putdata(pixel_data)
print(list(pixel_data))

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

.R., .G., .B. = .R., .G., .B., Alpha 
255, 255, 255 = 255, 255, 255, 0
254, 254, 254 = 255, 255, 255, 1
253, 253, 253 = 255, 255, 255, 2
252, 252, 252 = 255, 255, 255, 3
..., ..., ... = ..., ..., ..., 4
..., ..., ... = ..., ..., ..., 5
..., ..., ... = ..., ..., ..., 6
..., ..., ... = ..., ..., ..., .
..., ..., ... = ..., ..., ..., 255

Мне бы хотелось, чтобы конечный результат был белым и заштрихован с соответствующими уровнями непрозрачности (альфа-прозрачность)

Предоставлено изображение, чтобы показать, каким должен быть конечный результат белого цвета. Синий фон для удобного просмотра: Provided image to show what the white end result should be like.  Blue background for easy viewing

Ответы [ 2 ]

1 голос
/ 07 ноября 2019

Был в состоянии добавить еще несколько битов к коду Марка и достичь точных результатов, которые я хотел. Спасибо!

#!/usr/bin/env python3
from PIL import Image

# Open image
img = Image.open('firefox.png').convert('RGBA')
img2 = img.copy()

# Extract Red channel
r, g, b, a = img.split()

# Generate Alpha channel as (255-Red)
alpha_r = r.point(lambda p: 255 - p)
alpha_g = g.point(lambda p: 255 - p)
alpha_b = b.point(lambda p: 255 - p)
alpha_a = b.point(lambda p: 255 - p)

# Fill original image with white
img.paste((255, 255, 255), box=(0, 0, img.width, img.height))

# Add in alpha channel
img.putalpha(alpha_r), img.putalpha(alpha_g), img.putalpha(alpha_b), img.putalpha(alpha_a)

# crop out white area
img = Image.composite(img, img2, img2)

# Save
img.save('result.png')
1 голос
/ 05 ноября 2019

Я думаю, что вы имеете в виду это:

import numpy as np
from PIL import Image

# Open image and ensure it has an alpha channel
im = Image.open('image.png').convert('RGBA')

# Make into Numpy array, shape [h,w,4]
ni = np.array(im)

# Set the alpha channel of each pixel to "255 - red"
ni[...,3] = 255 - ni[...,0]

# Set the RGB of each pixel to white (255,255,255)
ni[:,:,(0,1,2)] = 255

# Make back into PIL Image and save
Image.fromarray(ni).save('result.png')

Если по какой-то причине вы возражаете против Numpy , вы можете сделать это в прямой PIL / Pillow следующим образом:

#!/usr/bin/env python3

from PIL import Image

# Open image, ensuring in RGB mode, rather than palette or greyscale
im = Image.open('image.png').convert('RGB')

# Extract Red channel
R, _, _ = im.split()

# Generate Alpha channel as (255-Red)
Alpha = R.point(lambda p: 255-p)

# Fill original image with white
im.paste((255,255,255),box=(0,0,im.width,im.height))

# Add in alpha channel
im.putalpha(Alpha)

# Save
im.save('result.png')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...