AIMP Forum

AIMP for Windows => Предложения / Suggestions => Skin Editor, Skin Engine => Skin Engine => Topic started by: Zhenya on December 13, 2018, 18:26:47

Title: Возможность получить цвет рассчитанный на основе обложки альбома
Post by: Zhenya on December 13, 2018, 18:26:47
Чтобы можно было перекрашивать элементы скина под обложку альбома, как это делает плагин Hameleon (https://www.aimp.ru/?do=catalog&rec_id=715).



Например, сейчас для реализации такого в скине Soot (https://www.aimp.ru/forum/index.php?topic=57809.0) используется очень сильно растянутая обложка альбома:

Вопрос: как ты сделал заливку под цвет кавера?
Просто растянул обложку до неприличия, примерно 200000px в ширину

Вот ещё пример с такой же реализацией — neo Groover (https://www.deviantart.com/laziem/art/neo-Groover-AIMP4-Skin-679950933).

Но минус такого способа в том, что это достаточно ресурсозатратно даже для перекраски одного элемента в скине. А таких элементов может быть несколько и достаточно больших.
Также таким способом не перекрасить текст в скине.

Правда минус сабжа в сравнении с плагином есть — не получится перекрасить цветные текстуры.
Но плюс в том, что в отличие от плагина сабж позволит не переприменять скин целиком для перекраски, а перекрашивать отдельные элементы точечно, что сделать легче. Например, скин по умолчанию, если в нём выбрана тёмная тема, при переприменении скина сначала загружается со светлой темой, а потом скрипт меняет светлую тему на тёмную.



Пример использования:
Скрипт привязан к prvPlayingFileInfo.CoverArt. При смене обложки срабатывает скрипт, который меняет цвет нужных элементов в скине.

Соответственно, думаю, сабж должен быть реализован в виде функции, которую можно использовать в скрипте.
Только в каком момент рассчитывать цвет обложки альбома? При вызове функции или при смене обложки альбома?
Во втором случае будет лишняя работа в том случае, если скин не использует этот цвет. А в первом возможна ситуация, когда в скине эта функция вызывается несколько раз и каждый раз будет рассчитываться цвет.
Title: Re: Возможность получить цвет рассчитанный на основе обложки альбома
Post by: gr-e on December 13, 2018, 18:33:39
В идеале - менять цвет обложки, как это сделано в Hameleon. Иначе не будет совместимости со старыми скинами.
Title: Re: Возможность получить цвет рассчитанный на основе обложки альбома
Post by: Zhenya on December 13, 2018, 18:38:55
В идеале - менять цвет обложки, как это сделано в Hameleon. Иначе не будет совместимости со старыми скинами.

Эмм, её же в любом случае не будет. В старых скинах не используется сабжевая функция.
Если только не добавить опцию в настройки плеера, то есть фактически интегрировать аналог плагина Hameleon.
Title: Re: Возможность получить цвет рассчитанный на основе обложки альбома
Post by: gr-e on December 13, 2018, 18:41:36
Если только не добавить опцию в настройки плеера, то есть фактически интегрировать аналог плагина Hameleon.
Я это и имел ввиду.
Title: Re: Возможность получить цвет рассчитанный на основе обложки альбома
Post by: Zhenya on December 13, 2018, 21:33:57
Если только не добавить опцию в настройки плеера, то есть фактически интегрировать аналог плагина Hameleon.

Я это и имел ввиду.

На мой взгляд, встроенный аналог Hameleon'а имеет смысл только в том случае, если получится перекрашивать скин целиком без переприменения скина, как это происходит сейчас.

А современные скины не такие лёгкие, чтобы каждый раз переприменять скин целиком. Особенно при быстром переключении треков.
Например, скин по умолчанию, если в нём выбрана тёмная тема, при переприменении скина сначала загружается со светлой темой, а потом скрипт меняет светлую тему на тёмную. И так каждый раз.
Или скин neo Groover из первого сообщения — он ещё тяжелее и переприменяется ещё дольше.

Вообще "встроенный аналог Hameleon'а" не нужен на мой взгляд. Потому что это не must have функция.
Title: Re: Возможность получить цвет рассчитанный на основе обложки альбома
Post by: Black_AVP on December 14, 2018, 10:06:22
Довольно хитрой должна быть эта функция, даже интелектуальной. Надо просканировать все пиксели, взвесить цвета и не факт, что максимум совпадёт с общей тональностью картинки, а если учесть, что попадаются jpeg-и низкого качаства, с шумом и артефактами, то ....
Интересно бы взглянуть на этот алгоритм в Хамелеоне.
А при растяжении кавера до "неприличных" размеров мы видим всего один, может, несколько, пикселей одного угла картинки.

Кстаи, в виндах, ведь, есть подобная фича - кнопки в панели задач подсвечиваются неким усреднённым цветом иконок приложения, может, такая функция есть в WinAPI.
Title: Re: Возможность получить цвет рассчитанный на основе обложки альбома
Post by: gr-e on December 14, 2018, 11:18:49
Зачем сканировать все пиксели, достаточно взять несколько точек.
Даже с одной точкой неплохой результат получается.
Title: Re: Возможность получить цвет рассчитанный на основе обложки альбома
Post by: Black_AVP on December 14, 2018, 12:45:16
Даже с одной точкой неплохой результат получается.
Это вообще несерьёзно, в одной точке может быть случайный цвет.
Title: Re: Возможность получить цвет рассчитанный на основе обложки альбома
Post by: Zhenya on December 14, 2018, 17:18:23
Кстати, в 8-ом Андроиде берутся два цвета из обложки альбома, а не один:

(https://i.imgur.com/3Gtdkj7.png)

Цвет для фона и цвет для текста. Хорошо было бы тогда и в случае реализации сабжа тоже получать два цвета из обложки альбома.

Вот как это сделано в Андроиде (если я правильно нашёл):
— https://android.googlesource.com/platform/frameworks/base.git/+/master/packages/SystemUI/src/com/android/systemui/statusbar/notification/MediaNotificationProcessor.java#92
— https://android.googlesource.com/platform/frameworks/base.git/+/master/core/java/com/android/internal/graphics/palette/Palette.java
— https://developer.android.com/training/material/palette-colors#extract-color-profiles

Довольно хитрой должна быть эта функция, даже интелектуальной.

Согласен, что непростой.

Зачем сканировать все пиксели, достаточно взять несколько точек.
Даже с одной точкой неплохой результат получается.

Это вообще несерьёзно, в одной точке может быть случайный цвет.

+1. По ссылкам выше, как я понял, обложка альбома уменьшается до 150*150 пкс и потом уже рассматривается каждый пиксель.
Title: Re: Возможность получить цвет рассчитанный на основе обложки альбома
Post by: Artem on December 16, 2018, 18:13:37
Да, я тоже думаю, что нужно портировать алгоритм с андроида
Title: Re: [Запланировано] Возможность получить цвет рассчитанный на основе обложки альбома
Post by: Artem on June 23, 2020, 13:35:50
А в каком виде это отдавать скину?
Title: Re: [Запланировано] Возможность получить цвет рассчитанный на основе обложки альбома
Post by: Black_AVP on June 23, 2020, 14:37:36
А в каком виде это отдавать скину?
Поскольку без скриптов здесь не обойтись, то, наверное, добавить функцию, возвращающую основной цвет кавера в формате TColor, может, ещё и цвет фона.
Title: Re: [Запланировано] Возможность получить цвет рассчитанный на основе обложки альбома
Post by: Artem on June 23, 2020, 15:00:28
Поскольку без скриптов здесь не обойтись, то, наверное, добавить функцию, возвращающую основной цвет кавера в формате TColor, может, ещё и цвет фона.

Можно и обойтись - использовать, например, какой-нибудь Color-based ресурс. Ну и как минимум нужна нотификация
Title: Re: [Запланировано] Возможность получить цвет рассчитанный на основе обложки альбома
Post by: Black_AVP on June 23, 2020, 15:47:56
Наверняка захочется получить из основного цвета кавера цветА в той же гамме, но разной насыщенности и яркости или контрастный цвет для раскрашивания различных элементов скина.
Из ресурса в скрипте считывать цвет, имхо, менее удобно.
А в качестве нотификатора вполне подойдёт onTrackStarted.
Title: Re: [Запланировано] Возможность получить цвет рассчитанный на основе обложки альбома
Post by: Zhenya on June 24, 2020, 00:15:10
А в качестве нотификатора вполне подойдёт onTrackStarted.

Но пользователь может поменять обложку альбома. Правда, в таком случае OnTrackStarted срабатывает.
Или обложка альбома прилететь с интернета с запозданием.

А в каком виде это отдавать скину?

Думаю ресурсы с цветом и событие будут лучше и легче в использовании. Вполне возможно, что кому-то будет достаточно привязать цвет контейнеров и текста к ресурсам и обойтись без скриптов. А событие уже для тех, кому нужно сделать что-то большее.



Ещё:
В Android для вычисления цвета для фона уведомления берётся левая половина изображения, чтобы был плавный переход, так как обложка альбома отображается в правой части уведомления:

Code: (https://android.googlesource.com/platform/frameworks/base.git/+/master/packages/SystemUI/src/com/android/systemui/statusbar/notification/MediaNotificationProcessor.java#305) [Select]
        // for the background we only take the left side of the image to ensure
        // a smooth transition

В Chrome тоже. Оригинальное изображение:

(https://i.imgur.com/A9IVzIT.png)

Получившийся цвет для фона (взята только левая половина):

(https://i.imgur.com/SYbHsXv.png)

Но в AIMP скинодел может разместить обложку альбома хоть как — справа от контейнера, как его продолжение или наоборот слева. Или просто внутри контейнера с отступами от его краёв.

Тогда, получается, нужны разные цвета для таких случаев:
1. Цвет фона, рассчитанный на основе все обложки альбома.
2. Цвет фона, рассчитанный на левой половине обложки альбома.
3. Цвет фона, рассчитанный на правой половине обложки альбома.
4. Цвет фона, рассчитанный на верхней половине обложки альбома?
5. Цвет фона, рассчитанный на нижней половине обложки альбома?

И цвет текста. Но на основе чего его рассчитывать? Как я понял, он рассчитывается на основе цвета фона. А если цветов фона несколько? Тогда нужно и несколько цветов текста?
Title: Re: [Запланировано] Возможность получить цвет рассчитанный на основе обложки альбома
Post by: Black_AVP on June 24, 2020, 08:26:19
Или обложка альбома прилететь с интернета с запозданием.
Тогда напрашивается свой нотификатор со своими внутренними переменными, как сделано для спектрума.

В Android для вычисления цвета для фона уведомления берётся левая половина изображения, чтобы был плавный переход, так как обложка альбома отображается в правой части уведомления ...
Это частный случай, его принимать во внимание вообще не стОит, картинка может быть разделена и по вертикали на два преобладающих цвета (да и вообще, как угодно) - классический пример: небо и земля. Текст может располагаться в любой стороне от кавера, и сверху и снизу. Кому-то наверняка захочется на основе полученных цветов перекрасить ещё и плейлист и фонотеку.
Другое дело, что выбрать фоном, а что цветом текста/других элементов? В скрипте это ещё можно проанализировать, скорректировать, в конце концов взять для того же текста контрастный цвет относительно преобладающего в кавере, а жёсткая ссылка на ресурс может привести в каком-то случае к почти нечитаемому тексту.
Title: Re: [Запланировано] Возможность получить цвет рассчитанный на основе обложки альбома
Post by: Zhenya on June 24, 2020, 13:29:54
Это частный случай, его принимать во внимание вообще не стОит, картинка может быть разделена и по вертикали на два преобладающих цвета (да и вообще, как угодно) - классический пример: небо и земля. Текст может располагаться в любой стороне от кавера, и сверху и снизу.

Речь не про то, что обложка альбома может быть по разному визуально разделена, а то что в дизайне скина может быть плавный переход в один сплошной цвет с любой стороны от обложки альбома.
В Android плавный переход слева и вычисляется цвет для фона на основе левой половины обложки альбома всегда, независимо от того, как визуально разделена обложка альбома.

Другое дело, что выбрать фоном, а что цветом текста/других элементов? В скрипте это ещё можно проанализировать, скорректировать, в конце концов взять для того же текста контрастный цвет относительно преобладающего в кавере, а жёсткая ссылка на ресурс может привести в каком-то случае к почти нечитаемому тексту.

Цвет для текста специально вычисляется таким образом, чтобы был читаемым и достаточно контрастным поверх цвета фона. То есть цвет текста зависит от цвета фона.
Title: Re: [Запланировано] Возможность получить цвет рассчитанный на основе обложки альбома
Post by: Black_AVP on June 24, 2020, 13:56:19
Речь не про то, что обложка альбома может быть по разному визуально разделена, а то что в дизайне скина может быть плавный переход в один сплошной цвет с любой стороны от обложки альбома.
Картинка в общем случае может весьма пёстрой. И какой там будет результирующий цвет и о каком плавном переходе может идти речь?

В Android плавный переход слева и вычисляется цвет для фона на основе левой половины обложки альбома всегда, независимо от того, как визуально разделена обложка альбома.
Это лишь одна единственная дизайнерская идея, наверное, не только для этого реализуется эта фича и не думаю, что все сразу кинутся её повторять.

Цвет для текста специально вычисляется таким образом, чтобы был читаемым и достаточно контрастным поверх цвета фона. То есть цвет текста зависит от цвета фона.
А почему "цвет фона" должен использоваться именно для фона? К примеру, в случае монохромного скина это может и цвет текста или элементов управления.
По хорошему, надо бы вычислять два максимума: тот, что "для фона", а второй в области спектра, сдвинутой на 180 град., т. е. заведомо контрастный по цвету, а скинодел уж сам решит, что будет цветом текста, а что цветом фона.

Резюме: не хорошо вычислять цвет по половинке картинки, в оставшейся может оказаться совсем другая палитра.
Title: Re: [Запланировано] Возможность получить цвет рассчитанный на основе обложки альбома
Post by: Zhenya on June 24, 2020, 14:31:38
Резюме: не хорошо вычислять цвет по половинке картинки, в оставшейся может оказаться совсем другая палитра.

Я не говорил, что нужен только один цвет, вычисленный по одной половине изображения. Я говорил, что такой приём используется в дизайне уведомлений в Android, и такое вполне может пригодиться и для AIMP. Например, минималистичное главное окно или шапка главного окна с плавным перетеканием обложки в фон. Или мини-плеер в стиле уведомления в Android.



Тогда, в идеале, нужно сделать сразу хорошо и гибко и реализовать извлечение палитры цветов из задаваемого региона изображения

Quote from: https://developer.android.com/training/material/palette-colors#extract-color-profiles
(https://i.imgur.com/SZREmxP.png)

Quote from: https://developer.android.com/training/material/palette-colors#customize-your-palette
setRegion()
This method indicates what area of the bitmap the builder uses when creating the palette. You can only use this method when generating the palette from a bitmap, and it does not affect the original image.

Тогда скинодел сам сможет указать, какой регион изображения ему нужен и извлечь оттуда профили основных цветов (aka Light Vibrant, Vibrant, Dark Vibrant, Light Muted, Muted, Dark Muted).
Но тогда это точно:

Тогда напрашивается свой нотификатор со своими внутренними переменными, как сделано для спектрума.
Title: Re: [Запланировано] Возможность получить цвет рассчитанный на основе обложки альбома
Post by: Zhenya on June 24, 2020, 14:45:29
Тогда, в идеале, нужно сделать сразу хорошо и гибко и реализовать извлечение палитры цветов из задаваемого региона изображения

И не забыть про доминантный цвет, именно он используется для фона уведомления в Android:

Quote from: https://android.googlesource.com/platform/frameworks/base.git/+/master/packages/SystemUI/src/com/android/systemui/statusbar/notification/MediaNotificationProcessor.java#260
Code: [Select]
    private static Palette.Swatch findBackgroundSwatch(Palette palette) {
        // by default we use the dominant palette
        Palette.Swatch dominantSwatch = palette.getDominantSwatch();
        ...



Кстати, для текста используется один из цветовых профилей (aka Light Vibrant, Vibrant, Dark Vibrant, Light Muted, Muted, Dark Muted) — https://android.googlesource.com/platform/frameworks/base.git/+/master/packages/SystemUI/src/com/android/systemui/statusbar/notification/MediaNotificationProcessor.java#173

upd
Доминантный для текста тоже может использоваться. Правда, не понял, как он не пересекается с доминантным для фона.
Title: Re: [Запланировано] Возможность получить цвет рассчитанный на основе обложки альбома
Post by: Artem on June 24, 2020, 21:27:20
В Android для вычисления цвета для фона уведомления берётся левая половина изображения, чтобы был плавный переход, так как обложка альбома отображается в правой части уведомления:

Я склоняюсь к алгоритму, что заложен Windows - он берет цветной, частоиспользуемый и самый яркий цвет из картинки после квантования. Я думаю, цвета акцента нам будет более, чем достаточно.
Title: Re: [Запланировано] Возможность получить цвет рассчитанный на основе обложки альбома
Post by: Zhenya on June 24, 2020, 22:15:22
Я склоняюсь к алгоритму, что заложен Windows - он берет цветной, частоиспользуемый и самый яркий цвет из картинки после квантования. Я думаю, цвета акцента нам будет более, чем достаточно.

А второй цвет для текста, рассчитанный на основе обложки альбома?
Можно самому выбирать из белого или чёрного на основе контраста с фоном, но это будет хуже выглядеть, чем цвет из обложки, как тут:

(https://i.imgur.com/3Gtdkj7.png)
Title: Re: [Запланировано] Возможность получить цвет рассчитанный на основе обложки альбома
Post by: Artem on June 24, 2020, 22:35:24
А второй цвет для текста, рассчитанный на основе обложки альбома?
Можно самому выбирать из белого или чёрного на основе контраста с фоном, но это будет хуже выглядеть, чем цвет из обложки, как тут:

Его можно посчитать на основе первого цвета (как раз в контраст)
Title: Re: [Запланировано] Возможность получить цвет рассчитанный на основе обложки альбома
Post by: Zhenya on June 25, 2020, 21:14:54
Его можно посчитать на основе первого цвета (как раз в контраст)

Но если цвет фона получился чёрный, то для текста цвет в контраст можно посчитать только белый, но в обложке альбома могут быть и другие цветовые акценты, например:

Изображения:

(https://i.imgur.com/gO30oHv.png)

Результат:

(https://i.imgur.com/mPO8YZ5.png)

Но потом я ещё раз вчитался в цитату:

Я склоняюсь к алгоритму, что заложен Windows - он берет цветной, частоиспользуемый и самый яркий цвет из картинки после квантования. Я думаю, цвета акцента нам будет более, чем достаточно.

Получается, чёрный для цвета фона как в примере выше не получится. А возьмётся цветной оттенок.

Попробовал сымитировать — цвет текста из примера выше применил к фону, а текст покрасил в чёрный. Ну и вокруг «обложек альбомов» добавил отступы, раз плавного перехода уже нет:

(https://i.imgur.com/3PtBxq5.png)

Ну... Вроде имеет право на жизнь.