Как применить наложение цвета к спрайту в оттенках серого для более мягких результатовPython

Программы на Python
Ответить
Anonymous
 Как применить наложение цвета к спрайту в оттенках серого для более мягких результатов

Сообщение Anonymous »

Я пытаюсь раскрасить спрайт семян в оттенках серого, чтобы добиться естественного результата, но столкнулся с проблемами. У меня есть базовый спрайт в оттенках серого, и я добавляю к нему наложение цвета. Однако когда я применяю наложение, цвета кажутся слишком яркими. Я хотел бы воспроизвести внешний вид моего эталонного изображения, где цвета хорошо смешаны и нежны. Как я могу настроить метод наложения или смешивания, чтобы добиться более мягкого и реалистичного эффекта?
(Я добавляю фон на второе изображение, чтобы его было легче увидеть, поскольку цвет белый. )
Изображение

Изображение
[img]https://i.sstatic .net/f2cFVI6t.png[/img]

Это мой текущий прогресс
Изображение
Изображение

Цвет первого изображения #AEAEAEFF #ED1C24FF и цвет второго изображения #23446FFF #C6AF32FF
Вот мой нынешний подход:
  • Я начинаю с базового спрайта в оттенках серого, обрезаю его и применяю наложение цвета. >
  • Я умножаю значения наложения RGB на яркость оттенков серого каждого пикселя, используя этот код:

    Код: Выделить всё

    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
    
  • После раскрашивания базового и наложенного изображений я накладываю цветной слой поверх основы, используя прозрачность для смешивания:

    Код: Выделить всё

    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
    
    img_base = image.crop((base * 16, 0, base * 16 + 16, 16))
    add_color_overlay(img_base, bg)
    img_over = image.crop((over * 16, 16, over * 16 + 16, 32))
    add_color_overlay(img_over, fg, is_overlay=True)
    
    img_base.paste(img_over, (0, 0), mask=img_over)
    image_file = BytesIO()
    img_base.save(image_file, format="PNG")
    image_file.seek(0)
    return image_file
    
Как мне настроить технику смешивания, чтобы добиться более мягкого и естественного эффекта наложения? Существуют ли какие-либо конкретные режимы смешивания, настройки или методы, которые помогут лучше интегрировать наложение цвета с базой оттенков серого в Python (предпочтительно с использованием PIL)?


Подробнее здесь: https://stackoverflow.com/questions/791 ... er-results
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»