Пользователи · Новые посты · Правила форума · Поиск по форуму · · · Регистрация
Страница 27 из 27«12252627
Форум о визуальных новеллах » Для разработчиков » Ren'Py » Помощь по Rep'Py (Вопрос\Ответ)
Помощь по Rep'Py (Вопрос\Ответ)

TERNOX
Дата: Вторник, 30 Сентября 2014, 21:50 | Сообщение # 1
Администратор
Сообщений: 405
Награды: 36
Репутация: 502
Сюда пользователи сайта могут писать вопросы о тех или иных функциях движка Ren'Py, а мы попытаемся на них ответить:)


Я у мамы ямаман.

Ikuku
Дата: Суббота, 05 Августа 2017, 16:50 | Сообщение # 391
Проверенный
Сообщений: 3
Награды: 1
Репутация: 27
Замечания: 0%
Если коротко, то да: любое отдельное изображение можно перекрасить с помощью im.MatrixColor (но только целиком).

Работает он примерно следующим образом: берет каждый пиксель изображения, и вместо текущего цвета/прозрачности ставит новый, в соответствии со вторым полученным параметром (matrix). Второй параметр может быть либо матрицей/кортежем (это для тех, кому не хватает дефолтных возможностей и кто хочет сделать все руками), либо объектом типа im.matrix (собственно, набор готовых "матриц", каждая из которых заранее сконструирована, чтобы десатурировать, менять цвет, и т.д.)

Если у нас второй параметр - матрица (физически записанная, как список из 20-25 чисел), то измененные цвета каждого пикселя считаются по формуле из документации (переменные от a до t берутся из списка, R, G, B и A - из параметров пикселей оригинальной картинки). Если второй параметр - один из готовых матричных объектов, то о формулах волноваться не надо.

Матричные объекты можно перемножать. Пример из документации: im.matrix.desaturate() * im.matrix.tint(0.9, 0.9, 1.0) читается как "сначала обесцветь, потом покрась (синим, т.к. в tint передан кортеж, обозначающий оттенок синего)"

Список встроенных матричных объектов (МО) (вкратце, из документации):

im.matrix.brightness(b) - МО для изменения яркости. Параметр b принимает значения от -1 до 1, чем меньше, тем темнее.

im.matrix.colorize(black_color, white_color) - МО для покраски "темных" и "светлых" пикселей. "Темные" красятся цветом black_color, светлые, соответственно, white_color. NB: не чисто черные и белые, а именно темные и светлые.

im.matrix.contrast© - МО для изменения контраста. Параметр c должен быть больше нуля, от 0 до 1.0 - понижение контраста картинки, больше 1.0 - увеличение.

im.matrix.desaturate() - МО для обесцвечивания. Краткая запись для im.matrix.saturation(0).

im.matrix.hue(h) - МО для изменения цветности. H - градус смещения цвета по цветовому кругу (круг). Т.е. если изначально цвет пикселя был желтый, и h = 45, то новый цвет станет темно-оранжевым.

im.matrix.identity() - МО для того, чтобы ничего с картинкой не делать. ¯\_(ツ)_/¯

im.matrix.invert() - МО для инвертирования цветовых каналов. "Негатив".

im.matrix.opacity(o) - МО для изменения альфа-канала (прозрачности). Параметр o принимает значения от 0 до 1.0, чем меньше, тем картинка прозрачнее.

im.matrix.saturation(level, desat = (0.2126, 0.7152, 0.0722)) - МО для изменения насыщенности. Параметр level (от 0 (черно-белый) до 1.0 (без изменений)) отвечает за цветность, параметр desat (в скобках приведены дефолтные значения) дополнительно корректирует RGB-уровни картинки для обесцвеченного изображения.

im.matrix.tint(r, g, b) - МО для изменения значений цветовых каналов. Параметры принимают значения от 0 до 1.0, измененный цвет считается в виде доли от оригинала. Т.е., скажем, если значение красного было 70 (из 255 возможных), а в r мы передали .1, новый красный будет равен 7.

Пара примеров того, как это использовать - ниже. Для наглядности создайте новый проект, киньте туда любую картинку и посмотрите, как это все выглядит.

Код
image bg test = "image.jpg"
image bg test0 = im.MatrixColor("image.jpg", [.5, .5, .5, .5, 0, .2, .2, .2, .2, 0, .3, .3, .3, .3, 0, .1, .1, .1, .1, 0])
image bg test1 = im.MatrixColor("image.jpg", im.matrix.colorize((255, 0, 0), "#00f"))
image bg test2 = im.MatrixColor("image.jpg", im.matrix.hue(45))
image bg test31 = im.MatrixColor("image.jpg", im.matrix.saturation(.5))
image bg test32 = im.MatrixColor("image.jpg", im.matrix.saturation(.5, desat=(0.1, 0.1, 0.722)))
image bg test4 = im.MatrixColor("image.jpg", im.matrix.tint(0.4, 0.4, 1.0))
    
label start:
    show bg test
    "Оригинальное изображение."
    
    show bg test0
    "Случайное изменение цветов с помощью матрицы в параметрах. \n\n \[.5, .5, .5, .5, 0,\n.2, .2, .2, .2, 0,\n.3, .3, .3, .3, 0,\n.1, .1, .1, .1, 0\]"
    
    show bg test1
    "Светлые цвета будут синими, темные - красными. Синий передан строкой (hex-код цвета), красный - кортежем. \n\n im.matrix.colorize((255,0,0), \"#00f\")"
    
    show bg test2
    "Цветность. Поворот цветового круга - 45 градусов. \n\n im.matrix.hue(45)"
    
    show bg test31
    "Обесцвечивание, desat задан по умолчанию. \n\n im.matrix.saturation(.5)"
        
    show bg test32
    "Обесцвечивание, desat задан вручную, со смещением в синюю сторону. \n\n im.matrix.saturation(.5, desat=(0.1, 0.1, 0.7))"
    
    show bg test4
    "Изменение оттенка: красный и зеленый каналы - в .4 от оригинального, синий - без изменений. \n\n im.matrix.tint(0.4, 0.4, 1.0)"


Плюс, изображение, которое возвращает im.MatrixColor(...), можно использовать как любую другую displayable, например, в операторе add в кастомном экране: add im.MatrixColor("image.jpg", im.matrix.hue(45))

P.S. с частично прозрачными png тоже работает.

mrWebster
Дата: Суббота, 05 Августа 2017, 17:05 | Сообщение # 392
Проверенный
Сообщений: 108
Награды: 0
Репутация: 20
Замечания: 0%
Ikuku, спасибо! До последнего не хотел, чтобы для этого была необходимость в объявлении новых объектов. Но, видимо, придется... Удачи с Вашим проектом.

Добро пожаловать во Мрак!

Ikuku
Дата: Суббота, 05 Августа 2017, 17:24 | Сообщение # 393
Проверенный
Сообщений: 3
Награды: 1
Репутация: 27
Замечания: 0%
mrWebster, для того, чтобы выводить дисплэйаблы без объявления, есть хитрое ключевое слово expression. Вроде такого:
Код
show expression im.MatrixColor("lorraine.jpg", im.matrix.hue(45))

Принимает любые дисплэйаблы, просто строку с адресом картинки тоже. Но, кмк, если спрайт будет использоваться больше двух раз, лучше объявить, запихать в переменную и не таскать большие куски кода туда-сюда. Если один-два раза, то можно и через expression, беды не будет.

И спасибо, взаимно :)
Форум о визуальных новеллах » Для разработчиков » Ren'Py » Помощь по Rep'Py (Вопрос\Ответ)
Страница 27 из 27«12252627
Поиск: