Я пытаюсь раскрасить спрайт семян в оттенках серого, чтобы добиться естественного результата, но столкнулся с проблемами. У меня есть базовый спрайт в оттенках серого, и я добавляю к нему наложение цвета. Однако когда я применяю наложение, цвета кажутся слишком яркими. Я хотел бы воспроизвести внешний вид моего эталонного изображения, где цвета хорошо смешаны и нежны. Как я могу настроить метод наложения или смешивания, чтобы добиться более мягкого и реалистичного эффекта?
(Я добавляю фон на второе изображение, чтобы его было легче увидеть, поскольку цвет белый. )
def add_color_overlay(image: Image.Image, hex_color: str) -> Image:
"""Add a color overlay to the image based on pixel brightness, using an RGBA hex color."""
hex_color = hex_color.lstrip('#') # Remove the hash symbol if present
overlay_r = int(hex_color[0:2], 16)
overlay_g = int(hex_color[2:4], 16)
overlay_b = int(hex_color[4:6], 16)
blended_data = []
for r, g, b, a in image.getdata():
if a != 0: # Only blend non-transparent pixels
# Calculate grayscale brightness as an average of RGB channels
grayscale_value = (r + g + b) // 3
# Blend overlay color with the grayscale intensity
blend_r = int(overlay_r * (grayscale_value / 255))
blend_g = int(overlay_g * (grayscale_value / 255))
blend_b = int(overlay_b * (grayscale_value / 255))
# Append the blended color with original alpha
blended_data.append((blend_r, blend_g, blend_b, a))
else:
# Keep transparent pixels as they are
blended_data.append((0, 0, 0, 0))
# Apply the blended data back to the image
image.putdata(blended_data)
return image
После раскрашивания базового и наложенного изображений я накладываю цветной слой поверх основы, используя прозрачность для смешивания:
Как мне настроить технику смешивания, чтобы добиться более мягкого и естественного эффекта наложения? Существуют ли какие-либо конкретные режимы смешивания, настройки или методы, которые помогут лучше интегрировать наложение цвета с базой оттенков серого в Python (предпочтительно с использованием PIL)?
Я пытаюсь раскрасить спрайт семян в оттенках серого, чтобы добиться естественного результата, но столкнулся с проблемами. У меня есть базовый спрайт в оттенках серого, и я добавляю к нему наложение цвета. Однако когда я применяю наложение, цвета кажутся слишком яркими. Я хотел бы воспроизвести внешний вид моего эталонного изображения, где цвета хорошо смешаны и нежны. Как я могу настроить метод наложения или смешивания, чтобы добиться более мягкого и реалистичного эффекта? (Я добавляю фон на второе изображение, чтобы его было легче увидеть, поскольку цвет белый. ) [img]https://i.sstatic.net/BgQMdRzu.png[/img]
Это мой текущий прогресс [img]https ://i.sstatic.net/E4B7700Z.png[/img] [img]https://i.sstatic.net/82Ndad8T.png[/img]
Цвет первого изображения #AEAEAEFF #ED1C24FF и цвет второго изображения #23446FFF #C6AF32FF Вот мой нынешний подход: [list] [*]Я начинаю с базового спрайта в оттенках серого, обрезаю его и применяю наложение цвета. >
[*]Я умножаю значения наложения RGB на яркость оттенков серого каждого пикселя, используя этот код: [code]def add_color_overlay(image: Image.Image, hex_color: str) -> Image: """Add a color overlay to the image based on pixel brightness, using an RGBA hex color.""" hex_color = hex_color.lstrip('#') # Remove the hash symbol if present overlay_r = int(hex_color[0:2], 16) overlay_g = int(hex_color[2:4], 16) overlay_b = int(hex_color[4:6], 16)
blended_data = [] for r, g, b, a in image.getdata(): if a != 0: # Only blend non-transparent pixels # Calculate grayscale brightness as an average of RGB channels grayscale_value = (r + g + b) // 3
# Blend overlay color with the grayscale intensity blend_r = int(overlay_r * (grayscale_value / 255)) blend_g = int(overlay_g * (grayscale_value / 255)) blend_b = int(overlay_b * (grayscale_value / 255))
# Append the blended color with original alpha blended_data.append((blend_r, blend_g, blend_b, a)) else: # Keep transparent pixels as they are blended_data.append((0, 0, 0, 0))
# Apply the blended data back to the image image.putdata(blended_data) return image [/code]
[*]После раскрашивания базового и наложенного изображений я накладываю цветной слой поверх основы, используя прозрачность для смешивания: [code]async def get_seed_sprite(base: int, over: int, bg, fg) -> bytes | None: file_dir = os.path.join(os.getcwd(), "public", "assets", "rttex", "seed.rttex") with open(file_dir, "rb") as f: image = Image.open(rttex_unpack(f.read())) # Base Sprite Pattern
[/list] Как мне настроить технику смешивания, чтобы добиться более мягкого и естественного эффекта наложения? Существуют ли какие-либо конкретные режимы смешивания, настройки или методы, которые помогут лучше интегрировать наложение цвета с базой оттенков серого в Python (предпочтительно с использованием PIL)?