1. pyOut

    11.03.2010

    0 ↑
    0 ↓
    Приветсвую,

    Хочу реализовать следующий эффект. Сделать верхнюю половину изображения полупрозрачной. Я знаю что фон изображения белый, хочу получить такой эффект наложив на верхнюю половину исходного изображения белый слой с полупрозрачностью. Если конечно есть более универсальный метод буду рад узреть его. Пытаюсь наложить на все изображение полупрозрачность следующим кодом
    def _blink(image):
    # Мое изображение RGBA, при не указании параметра a выдает ошибку
    r, g, b, a = image.split()
    blink = Image.new('L', (image.size[0], image.size[1]), 0xcc)
    image = Image.merge('RGBA',(r, g, b, blink))

    return image
    Но результат не тот который я ожидаю увидеть. Помогите правильным кодом.
  2. Иван Сагалаев

    13.03.2010

    2 ↑
    0 ↓

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

    def highlight(image):
    
        # белый свет -- тупой белый прямоугольник
        light = Image.new('RGB', size=image.size, color=0xFFFFFF) 
    
        # маска, изначально непрозрачная (белая)
        mask = Image.new('L', size=image.size, color=0xFF)
    
        # верхнюю половину маски делаем серой (полупрозрачной)
        draw = ImageDraw.Draw(mask)
        draw.rectangle((0, 0, image.size[0], image.size[1] / 2), fill=0x80)
    
        # сливаем белый свет на исходную картинку через маску
        return Image.composite(image, light, mask)
    

    А ещё лучше маску не рисовать внутри функции, а заготовить заранее: какой-нибудь градиент нарисовать. Правило простое: белое — непрозрачно, чёрное — прозрачно.

Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.