Лампа — это удобное приложение для смарт-телевизоров, которое позволяет превратить ваш телевизор в настоящий источник развлечений и информации. Благодаря лампе, вы сможете наслаждаться любимыми фильмами, сериалами, видео и музыкой прямо на экране вашего телевизора.
Одной из главных особенностей лампы является возможность установки плагинов. Плагины — это дополнительные модули, которые позволяют расширить функциональность приложения. С их помощью вы сможете добавить новые возможности, например, просмотр онлайн-кинотеатров, прослушивание музыкальных сервисов, просмотр фотографий и многое другое.
В лампе также имеется множество полезных функций. Вы можете создавать плейлисты с вашими любимыми фильмами и музыкой, делиться ими с друзьями и семьей. Также, вы сможете настроить персональные рекомендации, которые будут учитывать ваши предпочтения и предлагать вам интересные контенты.
В целом, лампа — это мощное и удобное приложение для смарт-телевизоров, которое сделает ваше развлечение еще более интересным и увлекательным. Установите лампу на свой телевизор и наслаждайтесь любимыми фильмами, сериалами и музыкой прямо на большом экране!
Настройка Lampa за 40 секунд
Лампа для смарт-тв: основные функции и возможности
Лампа для смарт-тв – это приложение, которое позволяет использовать ваш телевизор в качестве источника света. Оно предлагает ряд функций и возможностей, которые делают использование телевизора еще более удобным и интересным.
1. Изменение цвета и яркости
С помощью лампы для смарт-тв вы можете легко изменить цвет и яркость света на вашем телевизоре. Это позволяет создавать атмосферу под любое настроение – от яркого и энергичного до спокойного и расслабляющего.
2. Синхронизация со звуком и видео
Приложение лампы для смарт-тв позволяет синхронизировать свет с звуком и видео на экране. Это создает эффект погружения в происходящее на экране и делает просмотр фильмов и игр более захватывающим.
3. Режимы освещения
Лампа для смарт-тв предлагает различные режимы освещения, которые можно выбрать в зависимости от ситуации. Например, есть режимы «концерт», «романтика», «тусовка» и многие другие, которые подходят для разных мероприятий и настроения.
4. Таймер и расписание
Приложение лампы для смарт-тв позволяет установить таймер и расписание для автоматического включения и выключения света. Это удобно, если вы хотите, чтобы лампа включалась и выключалась в определенное время или по заданному расписанию.
5. Управление через смартфон
Лампу для смарт-тв можно управлять с помощью специального приложения на смартфоне. Это позволяет вам управлять светом на телевизоре из любой точки дома и даже вне его. Вы можете включать и выключать свет, изменять цвет и яркость, выбирать режимы освещения и многое другое.
В целом, лампа для смарт-тв предлагает множество функций и возможностей, которые делают использование телевизора более интересным и удобным. Она позволяет создавать атмосферу под любое настроение, синхронизировать свет с звуком и видео, выбирать различные режимы освещения, управлять светом через смартфон и многое другое. Это отличное дополнение к функциональности смарт-тв и обязательно стоит попробовать.
Управление освещением смарт-тв
Современные технологии позволяют смарт-тв не только просматривать телевизионные программы, но и контролировать освещение в помещении. Благодаря специальным приложениям, доступным для установки на смарт-тв, пользователь может легко и удобно управлять различными источниками света.
Одним из основных преимуществ управления освещением смарт-тв является возможность интеграции с другими устройствами в доме. Пользователь может создать сценарии освещения, которые будут автоматически активироваться при определенных событиях. Например, можно настроить так, чтобы включалась ночная подсветка при включении телевизора или чтобы свет в комнате постепенно затухал перед сном.
С помощью приложения для управления освещением на смарт-тв можно настроить яркость, цветовую температуру и насыщенность света. Это позволяет создавать различные атмосферы в помещении и подстраивать свет под свои предпочтения. Например, можно выбрать теплый свет для уютного вечера или яркий свет для чтения и работы.
Приложение для управления освещением на смарт-тв также может предлагать различные режимы освещения, которые удобно переключать в зависимости от ситуации. Например, можно выбрать режим «Кино», при котором свет будет приглушен и создастся эффект полного погружения в просмотр фильма.
Таким образом, управление освещением смарт-тв предоставляет пользователю широкие возможности для создания комфортной и уютной атмосферы в помещении. Благодаря интеграции с другими устройствами и настройке различных параметров света, каждый сможет настроить свой идеальный вариант освещения.
Поддержка плагинов и расширений
Приложение «Лампа» предоставляет возможность подключения плагинов и расширений, что позволяет пользователям расширить функциональность приложения и настроить его под свои потребности.
Плагины и расширения в «Лампе» могут добавлять новые возможности, улучшать существующие функции или интегрироваться с другими сервисами и приложениями. Например, с помощью плагинов можно добавить поддержку различных медиа-форматов, интегрировать приложение с социальными сетями или настроить автоматическое обновление контента.
Для установки плагинов и расширений в «Лампе» обычно используется специальный маркетплейс или каталог, где пользователи могут выбрать и скачать нужные им дополнения. После установки плагины и расширения становятся доступными в настройках приложения, где пользователь может активировать или деактивировать их, а также настраивать их параметры.
Поддержка плагинов и расширений в «Лампе» позволяет пользователям создавать уникальные и индивидуальные интерфейсы, адаптированные под их потребности и предпочтения. Благодаря этой функциональности приложение становится более гибким и удобным в использовании, а пользователи получают возможность настроить его именно под свои нужды.
Персонализация освещения в зависимости от контента
В приложении «Лампа» для смарт-тв предусмотрена возможность персонализации освещения в зависимости от контента, который вы просматриваете на экране. Это позволяет создавать уникальные эффекты и атмосферу в комнате, подстраиваясь под визуальное восприятие.
С помощью плагинов и настроек приложения «Лампа» вы можете выбирать цветовую гамму освещения, его яркость и насыщенность в зависимости от типа контента. Например, при просмотре фильма или сериала можно использовать теплые и насыщенные цвета, чтобы создать уютную и интимную атмосферу. А при игре в видеоигры можно выбрать яркие и насыщенные цвета, чтобы добавить динамики и энергетики.
Кроме того, приложение «Лампа» позволяет настраивать освещение в зависимости от времени суток. Например, утром можно использовать светлые и мягкие тона, чтобы создать эффект пробуждения и придать комнате свежесть. Вечером же можно выбрать теплые и расслабляющие цвета, чтобы создать атмосферу уюта и релаксации перед сном.
Такая персонализация освещения позволяет усилить эмоциональное восприятие контента, создавая более глубокую и насыщенную атмосферу. Это особенно полезно при просмотре фильмов, сериалов, игр и других медиа-контента, где каждая деталь имеет значение и может влиять на общее впечатление.
Интеграция с другими устройствами
Приложение «Лампа» предлагает широкие возможности для интеграции с другими устройствами, что позволяет управлять освещением еще более удобно и эффективно.
Управление через смартфон
С помощью приложения «Лампа» можно легко и удобно управлять освещением с помощью смартфона. Благодаря интуитивно понятному интерфейсу и возможности настройки различных сценариев освещения, пользователь может легко создавать комфортные условия в помещении.
Интеграция с голосовыми помощниками
Приложение «Лампа» поддерживает интеграцию с популярными голосовыми помощниками, такими как Siri, Google Assistant и Alexa. Это позволяет управлять освещением голосом, без необходимости использовать смартфон или пульт дистанционного управления.
Взаимодействие с умным домом
Приложение «Лампа» может быть интегрировано с другими устройствами умного дома, такими как умные розетки, термостаты или системы безопасности. Это позволяет создать единое управление всеми устройствами и автоматизировать их работу с помощью сценариев и расписаний.
Синхронизация с медиаустройствами
Приложение «Лампа» может быть синхронизировано с медиаустройствами, такими как телевизоры или аудиосистемы. Это позволяет создавать эффекты освещения, соответствующие происходящему на экране или воспроизводимой музыке, что создает уникальную атмосферу и повышает впечатление от просмотра или прослушивания.
Создание собственных сценариев освещения
В приложении «Лампа» для смарт-тв пользователь может создавать собственные сценарии освещения, чтобы настроить идеальную атмосферу в комнате. С помощью интуитивного интерфейса можно легко настроить яркость, цвет и режим работы лампы.
Для создания сценария пользователю доступны различные опции. Он может выбрать нужный цвет из палитры или ввести RGB-код напрямую. Также можно настроить яркость, выбрать режим работы (например, плавное затухание или мигание) и задать длительность каждого этапа сценария.
Для удобства пользователю предоставляется возможность сохранить созданный сценарий и назначить ему удобное имя. Таким образом, можно создать несколько сценариев для разных ситуаций и быстро переключаться между ними.
Созданные сценарии освещения могут быть использованы в разных комнатах. Пользователь может экспортировать их в виде файлов, чтобы поделиться с другими пользователями или импортировать на другие устройства.
Умные функции и автоматизация
Лампа: приложение для смарт-тв предлагает ряд умных функций, которые позволяют автоматизировать использование лампы и создать комфортную атмосферу в помещении.
Расписание включения и выключения
С помощью приложения можно настроить расписание включения и выключения лампы. Это позволяет автоматически включать свет в определенное время, например, чтобы проснуться по утрам, или выключать его, когда вы уходите из дома. Такая функция удобна для создания эффекта присутствия в случае вашего отсутствия.
Управление группами ламп
Приложение позволяет создавать группы ламп для одновременного управления несколькими источниками света. Вы можете настроить яркость, цвет и режим работы для каждой группы отдельно или изменить их одновременно. Это особенно удобно, если у вас в комнате установлено несколько ламп и вы хотите создать единый световой сценарий.
Создание сценариев освещения
Приложение позволяет создавать собственные сценарии освещения. Вы можете настроить яркость, цвет и режим работы лампы для каждого сценария. Например, вы можете создать романтическую атмосферу с помощью мягкого и теплого света или настроить яркий и энергичный свет для вечеринки. Все сценарии можно сохранить и легко переключаться между ними.
Такие умные функции и возможности приложения делают использование лампы еще более удобным и позволяют создавать разнообразные световые эффекты в помещении.
Источник: strahovkunado.ru
Плагины в MiHome
MiHome является своеобразным контейнером в котором хранятся подпрограммы (плагины). Они позволяют непосредственно управлять и просматривать информацию с ваших умных устройств.
Каждая плитка с устройством в MiHome это ваш умный гаджет, и для каждого из них после добавления в программу скачивается плагин.
Плагины хранятся в системных файлах телефона и получить к ним доступ можно только используя модифицированное приложение на Андроид.
В данном модифицированном приложении (MiHome_Vevs) их можно найти по пути Android /data /com.xiaomi.smarthome /files /plugin /install или vevs /files /plugin /install (если предварительно создать папку vevs и внутри нее папку files)
Плагины бывают 2 видов rn и mpk и находятся они в разных папках.
Раньше все плагины были в формате mpk в виде отдельного файла. Позднее разработчики стали переводить их на новую версию rn, которая более производительна и отзывчивее для пользователей, и почти все новые устройства идут уже непосредственно в виде rn плагинов.
Если устройств много, то сложно понять какая папка относится к нужному плагину.
Чтобы выбрать нужную, самый простой вариант вызвать контекстное меню удерживая палец на плитке устройства. Далее выбрать пункт «Изменить Имя». Так мы увидим ID папки плагина, IP адрес, токен и.д. (которые пригодятся для проброски устройств в HA).
Зачем менять плагины?
Если у вас устройство работает хорошо, присутствует русский перевод, то незачем.
Для многих устройств, предназначенных только для китайского рынка нет перевода внутри приложения на русский язык. Это можно исправить заменив папку с плагином на переведенную (энтузиастами или даже вы можете сделать это сами).
Отдельные устройства, например, Китайская версия roborock s50 не будет работать на регионе Россия, но если подменить папку с файлами, на модифицированной версии MiHome, вполне можно использовать пылесос на любом удобном регионе.
Или, например, увлажнители Smart mi 2 китайских версий заблокированные изготовителем вне Китая, отлично продолжают работать после замены оригинального плагина на кастомный.
Как поменять плагины?
ВАЖНО После установки модифицированного MiHome, не забудьте дать приложению разрешение на управление хранилищем
1 У вас должно быть установлено модифицированное приложение MiHome_vevs
2 Вы должны скачать нужный плагин для вашего устройства — папка с файлами или файл main.bundle
3 а (Если у вас Android 9 и ниже) Воспользовавшись любым файловым менеджером (Проводник, Total Commander, Cx Проводник) перейдите в папку по пути /ВНУТРЕННЯЯ_ПАМЯТЬ/ Android /data /com.xiaomi.smarthome /files /plugin /install/rn/ХХХХХ/xxxxxxx
b (Если у вас Android 10 и выше) Воспользовавшись любым файловым менеджером (Проводник, Total Commander, Cx Проводник) перейдите в папку vevs (или создайте сами, если ее нет) и создайте там папку files. После чего запустите MiHome и кликайте на свои устройства. Плагины перекачаются в папку /ВНУТРЕННЯЯ_ПАМЯТЬ/vevs/ files/ plugin/ install /rn/ ХХХХХ/ xxxxxxx
ХХХХХ — идентификатор плагина (ID плагина), ххххх — версия плагина.
4 После замены плагина снова запускаем MiHome и получаем решения проблем — русский интерфейс, русские озвучки, возможность функционирования на нужном регионе и т.д.
ВАЖНО Если после замены плагина или установки нового устройства появляется надпись об отсутствии плагина — это означает либо проблему с получением ответа сервера, либо повреждение папки плагина в ходе распаковки.
В первом случае стоит попробовать переключиться на мобильную сеть и повторить попытку.
Во втором — очистить данные приложения через настройки системы, либо если используете мод MiHome, включив настройку — «Профиль» — «Экспериментальное» — «Очистить папку с данными».
Краткие выводы
Замена плагинов в MiHome нужна в первую очередь для того, чтобы обойти ограничения или расширить возможности, которые скрыл, заблокировал или не разработал разработчик ПО, в данном случае наша любимая Xiaomi.
В большинстве случаев необходимость в замене плагинов будет появляться только если вы используете «китайские» устройства, предназначенные только для внутреннего рынка (иероглифы на коробке, плоская вилка).
Если вас устраивает работа устройства (перевод, функционал) менять плагины вам не нужно.
Не всегда нужный функционал можно получить заменой плагинов, в некоторых случаях особенно после обновления прошивки, вернуть старый интерфейс или возможности устройства можно только понизив прошивку.
Источник: rumihome.ru
Добавляем в плеер функцию Ambilight при помощи умных ламп Xiaomi
2020-10-02 в 19:12, admin , рубрики: ambilight, java, vlc, vlc player, xiaomi, yeelight, Интернет вещей, обработка изображений, умный дом
Всем привет!
Думаю многие, интересующиеся умным домом или просто технологичным обустройством своего жилища, задумывались об «атмосферной» и нестандартной осветительной системе.
Один из способов такого «необычного» освещения комнаты во время просмотра фильмов предлагает компания Philips с технологией Ambilight, встроенной в особо навороченные телевизоры этого бренда.
В этой статье вы обнаружите реализацию подсветки Ambilight с помощью умных ламп Yeelight от Xiaomi!
Об Ambilight
Кто не знает – технология Ambilight представляет собой встроенную в телевизоры фоновую подсветку, которая, анализируя цветовую картинку кадра на экране телевизора, воспроизводит рассеянный свет по периметру телевизора.
- создает соответствующую фильму обстановку, что увеличивает вовлеченность при просмотре;
- визуально увеличивает размер изображения;
- обеспечивает ненавязчивую подсветку комнаты, что позволяет снизить напряжение на глаза в сравнении с просмотром фильма в полной темноте.
В общем, Ambilight является довольно интересной технологией, и подтверждением данного факта является наличие большого количества разнообразных вариантов ее «кустарной» реализации, представленных в интернете. Однако все они в подавляющем большинстве основываются на использовании адресной светодиодной ленты, приклееной к тыльной части телевизора/монитора/крышки ноутбука. Для такой реализации необходимо иметь как минимум физический внешний контроллер, отвечающий за управление светодиодами. Это требует специфических знаний от человека, захотевшего установить подобную систему. Поэтому в альтернативу я предлагаю максимально «прогерский» и довольно простой вариант исполнения такой подсветки при помощи умных ламп.
Что за «умные» лампы?
Для создания этого варианта подсветки понадобится любое осветительное устройство бренда Yeelight (дочерняя компания Xiaomi) или Xiaomi (но только те, в названии которых присутствует упоминание Yeelight). Это означает, что устройство встраивается в экосистему умного дома Xiaomi и управляется через приложение Yeelight.
На мой взгляд, адаптивная подсветка – не та фишка, ради которой кто-то побежит покупать умную лампу Xiaomi (за существенные деньги кстати). Однако, как по мне, это хорошая возможность расширить функционал уже имеющейся дома лампы. В любом случае, как обладатель двух ламп Xiaomi, могу заявить, что от двух месяцев их использования у меня остались только приятные впечатления.
Приложении Yeelight играет немаловажную роль в реализации этого проекта, так как в нем присутствует один полезный параметр – Developer mode.
В последних обновлениях его переименовали на «Управление по LAN»
Современная экосистема умного дома основывается на обмене данными между устройствами по протоколу wi-fi. В каждое умное устройство встроен wi-fi модуль, позволяющий подключаться к локальной беспроводной сети. Благодаря этому осуществляется управление устройством через облачный сервис умного дома.
Однако Developer mode позволяет связываться c устройством напрямую, отправляя запросы на выделенный устройству IP адрес (адрес устройства можно узнать в приложении Yeelight в информации об устройстве). Этот режим гарантирует прием данных с девайсов, находящихся в одной локальной сети с умной лампой. На сайте Yeelight присутствует небольшое демо функционала режима разработчика.
Благодаря этой опции возможно реализовать функцию адаптивной подсветки и встроить её в плеер с открытым исходным кодом.
Определение функционала
Дальнейший пост будет посвящен тому, с какими трудностями (и способами их решения) может столкнуться инженер, задумавшийся спроектировать подобное, а также общему прогрессу в реализации задуманного.
Если вас интересует исключительно готовая программа, то вы можете сразу перейти к пункту «Для тех, кто просто хочет пользоваться готовым плеером».
В первую очередь определимся с задачами, которые должен решать разрабатываемый проект. Основные пункты ТЗ для данного проекта:
- Необходимо разработать функционал, позволяющий динамически изменять параметры (цвет или яркость/температура света в случае использования устройства без rgb светодиодов) умной лампы в зависимости от текущего изображения в окне медиаплеера.
- Функционал должен поддерживать использование нескольких умных ламп разных моделей одновременно.
- Функционал должен иметь механизм независимого анализа нескольких зон изображения, что позволит указывать зону «отслеживания» цвета для конкретной лампы.
- Текущая конфигурация ламп должна сохраняться и загружаться при последующем использовании программы.
- Функционал должен встраиваться в выбранный для проекта медиапроигрыватель.
Для тех, кто просто хочет пользоваться готовым плеером
открой меня
Если у вас нет желания разбираться в реализации адаптивной подсветки и вы просто хотите пользоваться готовым плеером, можете скачать уже собранный jar файл из репозитория и затем обязательно прочитать раздел Before you start в README файле из репозитория.
Разработка
Выбор инструментов
Начальным этапом разработки проекта будет определение плеера для встраивания функции и библиотеки для связи с умной лампой.
Мой выбор пал на плеер vlcj player и библиотеку Yapi, написанные на языке Java. В качестве инструмента сборки был использован Maven.
Vlcj представляет собой фреймворк, позволяющий встраивать в приложение Java нативный плеер VLC, а так же управлять жизненным циклом плеера через java код. У автора фреймворка так же имеется демонстрационная версия плеера, который почти полностью повторяет интерфейс и функционал VLC плеера. Самая стабильная версия плеера на текущий момент является версия 3. Именно она будет использована в проекте.
Интерфейс плеера vlcj с открытыми дополнительными окнами
Преимущества vlcj плеера:
- огромное количество поддерживаемых форматов видео, что является давнишней особенностью плеера VLC;
- Java как ЯП, что позволяет открывать плеер на большом количестве операционных систем (в данном случае мы ограничены лишь реализацией VLC плеера, который неразрывно связан с java приложением).
- устарелый дизайн плеера, который решается собственной реализацией интерфейса;
- перед использованием программы требуется установка VLC плеера и Java версии не ниже 8, что определенно тянет на недостаток.
Использование Yapi в качестве библиотеки для соединения с умными гаджетами Yeelight можно обосновать в первую очередь простотой, а во вторых – немногочисленностью готовых решений. На текущий момент существует не так много сторонних инструментов для управления умными лампами, тем более на языке Java.
Главный минус библиотеки Yapi состоит в том, что ни одной его версии не присутствует в репозитории Maven, так что перед компиляцией кода проекта требуется вручную установить Yapi в локальный репозиторий (вся установка описана в README файле в репозитории).
Алгоритм анализа изображения
Принцип работы динамического освещения будет основан на периодическом цветовом анализе текущего кадра.
В результате этапа проб и ошибок был разработан следующий принцип анализа картинки:
С указанной периодичностью программа делает скриншот медиаплеера и получает объект класса BufferedImage. Далее, самым быстрым встроенным алгоритмом, размер исходного изображения изменяется до размера 20×20 пикселей.
Это необходимо для быстродействия алгоритма, ради которого мы можем пожертвовать некоторой точностью определения цвета. Также это необходимо для того, чтобы максимально снизить зависимость времени обработки изображения от разрешения текущего медиафайла.
Далее алгоритм разбивает получившееся изображения на четыре «базовые» зоны (левая верхняя, левая нижняя и т.д.) размером 10×10 пикселей.
«Базовые» зоны
Такой механизм реализован для обеспечения независимого анализа разных зон изображения, что позволяет в дальнейшем поставить осветительный прибор в определенном месте комнаты и указать какую зону изображения ему необходимо «отслеживать». При использовании программы с несколькими лампами этот функционал делает динамическое освещение намного атмосфернее.
Затем для каждой зоны изображения высчитывается средний цвет путем вычисления среднего арифметического отдельно для трех составляющих цвета (красного, зеленого, синего) каждого пикселя и компоновки получившихся данных в единственном значении цвета.
Благодаря четырем получившимся значениям мы можем:
- вычислить средний цвет 5 следующих зон: правой, левой, верхней, нижней и центральной зоны экрана (реализовано через вычисление среднего арифметического цвета включенных в искомую область «базовых» зон);
- вычислить среднюю яркость выбранной зоны в процентах по формуле: где r, g, b – красная/зеленая/синяя составляющие цвета
- вычислить среднюю температуру цвета в процентах по придуманной на коленке формуле: $$display$$begin begin 0, rle b, (r-b) / 255 * 100, r > b end end$$display$$ где r, b – красная/синяя составляющие цвета
Для эффективной и масштабируемой механики вычисления параметров изображения все дополнительные данные (не «базовые» зоны, температура и яркость цвета) вычисляются «лениво», т.е. по мере необходимости.
Весь код по обработке изображения вмещается в один класс ImageHandler:
public class ImageHandler < private static ListmainAreas = Arrays.asList(ScreenArea.TOP_LEFT, ScreenArea.TOP_RIGHT, ScreenArea.BOTTOM_LEFT, ScreenArea.BOTTOM_RIGHT); private static int scaledWidth = 20; private static int scaledHeight = 20; private static int scaledWidthCenter = scaledWidth / 2; private static int scaledHeightCenter = scaledHeight / 2; private Map screenData; private LightConfig config; //получаем массив с необходимыми данными для определения размеров зоны private int[] getDimensions(ScreenArea area) < int[] dimensions = new int[4]; if (!mainAreas.contains(area)) < return dimensions; >String name = area.name().toLowerCase(); dimensions[0] = (name.contains(«left»)) ? 0 : scaledWidthCenter; dimensions[1] = (name.contains(«top»)) ? 0 : scaledHeightCenter; dimensions[2] = scaledWidthCenter; dimensions[3] = scaledHeightCenter; return dimensions; > //возвращает изображение с указанными размерами private BufferedImage getScaledImage(BufferedImage image, int width, int height) < Image tmp = image.getScaledInstance(width, height, Image.SCALE_FAST); BufferedImage scaledImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); Graphics2D g2d = scaledImage.createGraphics(); g2d.drawImage(tmp, 0, 0, null); g2d.dispose(); return scaledImage; >//обработка изображения, включает изменение размера, разбиение на зоны, вычисление среднего цвета private void proceedImage(BufferedImage image) < BufferedImage scaledImage = getScaledImage(image, scaledWidth, scaledHeight); screenData = new HashMap<>(); mainAreas.forEach(area -> < int[] dimensions = getDimensions(area); BufferedImage subImage = scaledImage.getSubimage(dimensions[0], dimensions[1], dimensions[2], dimensions[3]); int average = IntStream.range(0, dimensions[3]) .flatMap(row ->IntStream.range(0, dimensions[2]).map(col -> subImage.getRGB(col, row))).boxed() .reduce(new ColorAveragerer(), (t, u) -> < t.accept(u); return t; >, (t, u) -> < t.combine(u); return t; >).average(); screenData.put(area, average); >); > public ImageHandler(BufferedImage image, LightConfig config) < this.config = config; proceedImage(image); >//получение данных об изображении по зоне и типу, флаг considerRate определяет учет коэффициентов(о них далее в посте) public int getValue(ScreenArea area, Feature feature, Boolean considerRate) < Integer intValue = screenData.get(area); if (intValue != null) < Color color = new Color(intValue); if (feature == Feature.COLOR) < return color.getRGB(); >else if (feature == Feature.BRIGHTNESS || feature == Feature.TEMPERATURE) < int value = (feature == Feature.BRIGHTNESS) ? getBrightness(color) : getTemperature(color); double rate = (feature == Feature.BRIGHTNESS) ? config.getBrightnessRate() : config.getTemperatureRate(); value = (value < 0) ? 0 : value; if (considerRate) < value = 10 + (int) (value * rate); >return (value > 100) ? 100 : value; > else < return 0; >> else < calculateArea(area); return getValue(area, feature, considerRate); >> //вычисление яркости цвета по формуле private int getBrightness(Color color) < return (int) ((color.getRed() * 0.2126f + color.getGreen() * 0.7152f + color.getBlue() * 0.0722f) / 255 * 100); >//вычисление температуры цвета по формуле private int getTemperature(Color color) < return (int) ((float) (color.getRed() — color.getBlue()) / 255 * 100); >//ленивое вычисление не «базовых» зон private void calculateArea(ScreenArea area) < int value = 0; switch (area) < case TOP: value = getAverage(ScreenArea.TOP_LEFT, ScreenArea.TOP_RIGHT); break; case BOTTOM: value = getAverage(ScreenArea.BOTTOM_LEFT, ScreenArea.BOTTOM_RIGHT); break; case LEFT: value = getAverage(ScreenArea.BOTTOM_LEFT, ScreenArea.TOP_LEFT); break; case RIGHT: value = getAverage(ScreenArea.BOTTOM_RIGHT, ScreenArea.TOP_RIGHT); break; case WHOLE_SCREEN: value = getAverage(mainAreas.toArray(new ScreenArea[0])); break; >screenData.put(area, value); > //возвращает среднее арифметическое цвета между указанными зонами private int getAverage(ScreenArea. areas) < return Arrays.stream(areas).map(color ->screenData.get(color)) .reduce(new ColorAveragerer(), (t, u) -> < t.accept(u); return t; >, (t, u) -> < t.combine(u); return t; >).average(); > //получение массива rgb из int-вого значения цвета public static int[] getRgbArray(int color) < int[] rgb = new int[3]; rgb[0] = (color >>> 16) rgb[1] = (color >>> 8) rgb[2] = (color >>> 0) return rgb; > //получение int-вого значения цвета из массива rgb public static int getRgbInt(int[] pixel) < int value = ((255 private int[] total = new int[]; private int count = 0; private ColorAveragerer() < >private int average() < int[] rgb = new int[3]; for (int it = 0; it < total.length; it++) < rgb[it] = total[it] / count; >return count > 0 ? getRgbInt(rgb) : 0; > private void accept(int i) < int[] rgb = getRgbArray(i); for (int it = 0; it < total.length; it++) < total[it] += rgb[it]; >count++; > private void combine(ColorAveragerer other) < for (int it = 0; it < total.length; it++) < total[it] += other.total[it]; >count += other.count; > > >
Для того, чтобы частые мерцания лампы не раздражали глаз, был введен порог изменения параметров. Например, лампа изменит значение яркости только если текущая сцена фильма будет более чем на 10 процентов ярче предыдущей.
Cравнение с другим методом анализа
Вы можете спросить: «Почему бы просто не уменьшить изображение до размера 2×2 пикселя и не считать полученные значения?».
Ответ будет таков: «Исходя из проведенных мною опытов, алгоритм определения среднего цвета через уменьшение размера изображения (или его зон) проявил себя менее стабильно и менее достоверно (особенно при анализе темных участков изображения), чем алгоритм, основанный на определении среднего арифметического всех пикселей».
Были испробованы несколько методов изменения размера изображения. Можно было воспользоваться библиотекой openCV для более серьезной работы с изображением, однако я посчитал это оверинженерингом для данной задачи. Для сравнения, ниже представлен пример определения цвета с помощью встроенного быстрого скейлинга класса BufferedImage и вычисления среднего арифметического цвета. Думаю комментарии излишни.
Конфигурирование
На текущий момент программа конфигурируется при помощи файла формата json. В качестве библиотеки для парсинга конфигурационного файла использована JSON.simple.
Json файл необходимо назвать «config.json» и положить в одну папку с программой для автоматического определения конфигурации, иначе при включении функции адаптивной яркости программа предложит самостоятельно указать файл конфигурации, открыв окно выбора файлов. В файле необходимо указать ip адреса осветительных устройств, «отслеживаемые» зоны изображения для каждого девайса, коэффициенты яркости и температуры цвета, либо период их автоматической установки (о чем будет описано в следующем пункте). Правила заполнения json файла описаны в README файле проекта.
Все изменения в интерфейсе (кнопка лампочки). При нажатии кнопки применится доступный файл конфигурации или откроется окно его выбора
Коэффициенты необходимы для более четкой настройки анализа изображения, например, чтобы сделать лампу чуть темнее или, наоборот, светлее. Все эти параметры не являются обязательными. Единственным обязательным параметром здесь являются значения ip адресов осветительных приборов.
Автоматическое выставление коэффициентов
Также в программе реализована функция автоматической подстройки коэффициентов в зависимости от текущей освещенности комнаты. Происходит это так: веб-камера вашего ноутбука с выбранной периодичностью делает снимок окружения, анализирует его яркость по уже описанным алгоритмам, и далее выставляет коэффициент по формуле:
где x – текущее значение яркости комнаты в процентах.
Включается эта функция с помощью прописывания специального тега в конфигурационном файле.
Пример работы функционала
Заключение
В результате решения поставленной задачи был разработан функционал, позволяющий использовать умные лампы Yeelight в качестве адаптивной подсветки медиафайлов. Дополнительно была реализована функция анализа текущей освещенности комнаты. Весь исходный код доступен по ссылке в моем репозитории github.
Всем спасибо за внимание!
P.S. Буду рад любым дополнениям, замечаниям и указанием на допущенные ошибки.
Источник: www.pvsm.ru