AIMP Forum
AIMP for Windows => Предложения / Suggestions => Skin Editor, Skin Engine => Skin Engine => Topic started 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. При смене обложки срабатывает скрипт, который меняет цвет нужных элементов в скине.
Соответственно, думаю, сабж должен быть реализован в виде функции, которую можно использовать в скрипте.
Только в каком момент рассчитывать цвет обложки альбома? При вызове функции или при смене обложки альбома?
Во втором случае будет лишняя работа в том случае, если скин не использует этот цвет. А в первом возможна ситуация, когда в скине эта функция вызывается несколько раз и каждый раз будет рассчитываться цвет.
-
В идеале - менять цвет обложки, как это сделано в Hameleon. Иначе не будет совместимости со старыми скинами.
-
В идеале - менять цвет обложки, как это сделано в Hameleon. Иначе не будет совместимости со старыми скинами.
Эмм, её же в любом случае не будет. В старых скинах не используется сабжевая функция.
Если только не добавить опцию в настройки плеера, то есть фактически интегрировать аналог плагина Hameleon.
-
Если только не добавить опцию в настройки плеера, то есть фактически интегрировать аналог плагина Hameleon.
Я это и имел ввиду.
-
Если только не добавить опцию в настройки плеера, то есть фактически интегрировать аналог плагина Hameleon.
Я это и имел ввиду.
На мой взгляд, встроенный аналог Hameleon'а имеет смысл только в том случае, если получится перекрашивать скин целиком без переприменения скина, как это происходит сейчас.
А современные скины не такие лёгкие, чтобы каждый раз переприменять скин целиком. Особенно при быстром переключении треков.
Например, скин по умолчанию, если в нём выбрана тёмная тема, при переприменении скина сначала загружается со светлой темой, а потом скрипт меняет светлую тему на тёмную. И так каждый раз.
Или скин neo Groover из первого сообщения — он ещё тяжелее и переприменяется ещё дольше.
Вообще "встроенный аналог Hameleon'а" не нужен на мой взгляд. Потому что это не must have функция.
-
Довольно хитрой должна быть эта функция, даже интелектуальной. Надо просканировать все пиксели, взвесить цвета и не факт, что максимум совпадёт с общей тональностью картинки, а если учесть, что попадаются jpeg-и низкого качаства, с шумом и артефактами, то ....
Интересно бы взглянуть на этот алгоритм в Хамелеоне.
А при растяжении кавера до "неприличных" размеров мы видим всего один, может, несколько, пикселей одного угла картинки.
Кстаи, в виндах, ведь, есть подобная фича - кнопки в панели задач подсвечиваются неким усреднённым цветом иконок приложения, может, такая функция есть в WinAPI.
-
Зачем сканировать все пиксели, достаточно взять несколько точек.
Даже с одной точкой неплохой результат получается.
-
Даже с одной точкой неплохой результат получается.
Это вообще несерьёзно, в одной точке может быть случайный цвет.
-
Кстати, в 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 пкс и потом уже рассматривается каждый пиксель.
-
Да, я тоже думаю, что нужно портировать алгоритм с андроида
-
А в каком виде это отдавать скину?
-
А в каком виде это отдавать скину?
Поскольку без скриптов здесь не обойтись, то, наверное, добавить функцию, возвращающую основной цвет кавера в формате TColor, может, ещё и цвет фона.
-
Поскольку без скриптов здесь не обойтись, то, наверное, добавить функцию, возвращающую основной цвет кавера в формате TColor, может, ещё и цвет фона.
Можно и обойтись - использовать, например, какой-нибудь Color-based ресурс. Ну и как минимум нужна нотификация
-
Наверняка захочется получить из основного цвета кавера цветА в той же гамме, но разной насыщенности и яркости или контрастный цвет для раскрашивания различных элементов скина.
Из ресурса в скрипте считывать цвет, имхо, менее удобно.
А в качестве нотификатора вполне подойдёт onTrackStarted.
-
А в качестве нотификатора вполне подойдёт onTrackStarted.
Но пользователь может поменять обложку альбома. Правда, в таком случае OnTrackStarted срабатывает.
Или обложка альбома прилететь с интернета с запозданием.
А в каком виде это отдавать скину?
Думаю ресурсы с цветом и событие будут лучше и легче в использовании. Вполне возможно, что кому-то будет достаточно привязать цвет контейнеров и текста к ресурсам и обойтись без скриптов. А событие уже для тех, кому нужно сделать что-то большее.
Ещё:
В Android для вычисления цвета для фона уведомления берётся левая половина изображения, чтобы был плавный переход, так как обложка альбома отображается в правой части уведомления:
// 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. Цвет фона, рассчитанный на нижней половине обложки альбома?
И цвет текста. Но на основе чего его рассчитывать? Как я понял, он рассчитывается на основе цвета фона. А если цветов фона несколько? Тогда нужно и несколько цветов текста?
-
Или обложка альбома прилететь с интернета с запозданием.
Тогда напрашивается свой нотификатор со своими внутренними переменными, как сделано для спектрума.
В Android для вычисления цвета для фона уведомления берётся левая половина изображения, чтобы был плавный переход, так как обложка альбома отображается в правой части уведомления ...
Это частный случай, его принимать во внимание вообще не стОит, картинка может быть разделена и по вертикали на два преобладающих цвета (да и вообще, как угодно) - классический пример: небо и земля. Текст может располагаться в любой стороне от кавера, и сверху и снизу. Кому-то наверняка захочется на основе полученных цветов перекрасить ещё и плейлист и фонотеку.
Другое дело, что выбрать фоном, а что цветом текста/других элементов? В скрипте это ещё можно проанализировать, скорректировать, в конце концов взять для того же текста контрастный цвет относительно преобладающего в кавере, а жёсткая ссылка на ресурс может привести в каком-то случае к почти нечитаемому тексту.
-
Это частный случай, его принимать во внимание вообще не стОит, картинка может быть разделена и по вертикали на два преобладающих цвета (да и вообще, как угодно) - классический пример: небо и земля. Текст может располагаться в любой стороне от кавера, и сверху и снизу.
Речь не про то, что обложка альбома может быть по разному визуально разделена, а то что в дизайне скина может быть плавный переход в один сплошной цвет с любой стороны от обложки альбома.
В Android плавный переход слева и вычисляется цвет для фона на основе левой половины обложки альбома всегда, независимо от того, как визуально разделена обложка альбома.
Другое дело, что выбрать фоном, а что цветом текста/других элементов? В скрипте это ещё можно проанализировать, скорректировать, в конце концов взять для того же текста контрастный цвет относительно преобладающего в кавере, а жёсткая ссылка на ресурс может привести в каком-то случае к почти нечитаемому тексту.
Цвет для текста специально вычисляется таким образом, чтобы был читаемым и достаточно контрастным поверх цвета фона. То есть цвет текста зависит от цвета фона.
-
Речь не про то, что обложка альбома может быть по разному визуально разделена, а то что в дизайне скина может быть плавный переход в один сплошной цвет с любой стороны от обложки альбома.
Картинка в общем случае может весьма пёстрой. И какой там будет результирующий цвет и о каком плавном переходе может идти речь?
В Android плавный переход слева и вычисляется цвет для фона на основе левой половины обложки альбома всегда, независимо от того, как визуально разделена обложка альбома.
Это лишь одна единственная дизайнерская идея, наверное, не только для этого реализуется эта фича и не думаю, что все сразу кинутся её повторять.
Цвет для текста специально вычисляется таким образом, чтобы был читаемым и достаточно контрастным поверх цвета фона. То есть цвет текста зависит от цвета фона.
А почему "цвет фона" должен использоваться именно для фона? К примеру, в случае монохромного скина это может и цвет текста или элементов управления.
По хорошему, надо бы вычислять два максимума: тот, что "для фона", а второй в области спектра, сдвинутой на 180 град., т. е. заведомо контрастный по цвету, а скинодел уж сам решит, что будет цветом текста, а что цветом фона.
Резюме: не хорошо вычислять цвет по половинке картинки, в оставшейся может оказаться совсем другая палитра.
-
Резюме: не хорошо вычислять цвет по половинке картинки, в оставшейся может оказаться совсем другая палитра.
Я не говорил, что нужен только один цвет, вычисленный по одной половине изображения. Я говорил, что такой приём используется в дизайне уведомлений в Android, и такое вполне может пригодиться и для AIMP. Например, минималистичное главное окно или шапка главного окна с плавным перетеканием обложки в фон. Или мини-плеер в стиле уведомления в Android.
Тогда, в идеале, нужно сделать сразу хорошо и гибко и реализовать извлечение палитры цветов из задаваемого региона изображения
(https://i.imgur.com/SZREmxP.png)
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).
Но тогда это точно:
Тогда напрашивается свой нотификатор со своими внутренними переменными, как сделано для спектрума.
-
Тогда, в идеале, нужно сделать сразу хорошо и гибко и реализовать извлечение палитры цветов из задаваемого региона изображения
И не забыть про доминантный цвет, именно он используется для фона уведомления в Android:
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
Доминантный для текста тоже может использоваться. Правда, не понял, как он не пересекается с доминантным для фона.
-
В Android для вычисления цвета для фона уведомления берётся левая половина изображения, чтобы был плавный переход, так как обложка альбома отображается в правой части уведомления:
Я склоняюсь к алгоритму, что заложен Windows - он берет цветной, частоиспользуемый и самый яркий цвет из картинки после квантования. Я думаю, цвета акцента нам будет более, чем достаточно.
-
Я склоняюсь к алгоритму, что заложен Windows - он берет цветной, частоиспользуемый и самый яркий цвет из картинки после квантования. Я думаю, цвета акцента нам будет более, чем достаточно.
А второй цвет для текста, рассчитанный на основе обложки альбома?
Можно самому выбирать из белого или чёрного на основе контраста с фоном, но это будет хуже выглядеть, чем цвет из обложки, как тут:
(https://i.imgur.com/3Gtdkj7.png)
-
А второй цвет для текста, рассчитанный на основе обложки альбома?
Можно самому выбирать из белого или чёрного на основе контраста с фоном, но это будет хуже выглядеть, чем цвет из обложки, как тут:
Его можно посчитать на основе первого цвета (как раз в контраст)
-
Его можно посчитать на основе первого цвета (как раз в контраст)
Но если цвет фона получился чёрный, то для текста цвет в контраст можно посчитать только белый, но в обложке альбома могут быть и другие цветовые акценты, например:
Изображения:
(https://i.imgur.com/gO30oHv.png)
Результат:
(https://i.imgur.com/mPO8YZ5.png)
Но потом я ещё раз вчитался в цитату:
Я склоняюсь к алгоритму, что заложен Windows - он берет цветной, частоиспользуемый и самый яркий цвет из картинки после квантования. Я думаю, цвета акцента нам будет более, чем достаточно.
Получается, чёрный для цвета фона как в примере выше не получится. А возьмётся цветной оттенок.
Попробовал сымитировать — цвет текста из примера выше применил к фону, а текст покрасил в чёрный. Ну и вокруг «обложек альбомов» добавил отступы, раз плавного перехода уже нет:
(https://i.imgur.com/3PtBxq5.png)
Ну... Вроде имеет право на жизнь.