Раскрасить серое RGBA изображение PIL Python
Здраствуйте уважаемые пользователи StackOverFlow. Я делаю симуляцию физики круглых тел на Python. (Просто для практики) И у меня есть одна RGBA текстура шарика:
И мне нужно изменять цвет шарика, зависимо от его технических характеристик. Например: Red это будет его масса, Green это будет плотность, а Blue это будет его размер. У нас есть шарик с массой 250, с плотностью 20, и размером 20. Тоесть (R:250, G:20, B:20). И теперь мне нужно этот шарик покрасить, причем не трогая его прозрачности. И тут у меня возникла проблема: В интернете есть лишь варианты c RGB, и фон моего шарика стает уже видимым. Есть варианты с перебором всего массива пикселей NumPy, но этот способ долгий как понедельник. А симуляция должна работать в реальном времени. Можете пожалуйста помочь мне? Я использую Pillow, но если придется могу установить дополнительные библиотеки. Главное, чтобы изменить цвет шарика не трогая фона. Тоесть функция должна вернуть:
Что я пробовал:
result = ImageOps.colorize(image, white = (255, 70, 70), black = (200, 0, 0))
и т.д.
Ответы (1 шт):
Не знаю, насколько такое решение оптимально, но можно взять байтовое представление картинки и заполнить все остальные компоненты нулями, кроме нужной. Например, все кроме нулевой компоненты, красной (ну и кроме последней, которая отвечает за яркость):
from PIL import Image
import numpy as np
image = Image.open('ball-rgba.png')
data = np.asarray(image).copy()
data[:,:,1:3] = 0
image_red = Image.fromarray(data)
image_red
Наверняка должны быть методы, которые позволяют менять пикселы "оптом" в самой картинке, но я сходу не нашёл, этим методом что у меня, можно менять только копию байтового представления и потом создавать из неё новую картинку.


