Поскольку в настоящее время это первый результат Google при поиске «Подушка от белого до прозрачного», я хотел бы добавить, что того же можно добиться с помощью numpy и моего теста (одно 8-мегапиксельное изображение с большим количеством белого фона). ) примерно в 10 раз быстрее (около 300 мс против 3,28 с для предложенного решения). Код также немного короче:
import numpy as np
def white_to_transparency(img):
x = np.asarray(img.convert('RGBA')).copy()
x[:, :, 3] = (255 * (x[:, :, :3] != 255).any(axis=2)).astype(np.uint8)
return Image.fromarray(x)
Его также легко заменить на версию, в которой «почти белый» (например, один канал 254 вместо 255) «почти прозрачен». Конечно, это сделает всю картинку частично прозрачной, за исключением чистого черного:
def white_to_transparency_gradient(img):
x = np.asarray(img.convert('RGBA')).copy()
x[:, :, 3] = (255 - x[:, :, :3].mean(axis=2)).astype(np.uint8)
return Image.fromarray(x)
Примечание: .copy()
необходим, поскольку по умолчанию изображения подушек преобразуются в массивы только для чтения.