MVP за день. Бесплатный 0.3MP Camera на андроид. LowCam
Дошел до меня тренд из твитера, с шакальными видео как в старых телефонах, оказалось на андроид почти неработает и денег стоит. Я сделал свое
LowCam 0.4MP . Кому просто скачать, а не читать:
И вот, в рамках "MVP за день" челенжа, который сам себе придумал, сделал клон приложения 0.3MP Camera (снимает фото\видео в формате старинных кнопочных телефонов), на андоид. Прикиньте, в их андроид версии даже видео нельзя снимать. А фото можно сделать бесплатно только 10 штук (включая скриншоты, sic), потом плоти.
Значит взял я свой любимый Kotlin, подключил стоковые инструменты отображения картинки с камеры, сьемки фото и видео, согласно первому актуальному гайду гугла (CameraX). И стал думать как это всё зашакалить (добавить эффекты старомодных сжатий) - до попадания на файлы фоток и на само превью. И вот что понял:
Никак
Дело в том, что стоковые инструменты на то и стоковые, что они максимально казуальные. А лезть в низкоуровневые альтернативы страшно - это точно растянет разработку на несколько дней.
Решено довольствоваться простым советским Bitmap(примитивная матрица пикселей), который CameraX может отдавать по каждому кадру.
Заменяем удобный автоматический PreviewView(какой то магией показывает изображение с камеры) на обычный ImageView (в ваших приложениях все картинки выводятся в них), и загружаем в него каждый приходящий с камеры битмап - превью экран камеры работает, а под нашим контролем теперь каждый пиксель этого видеопотока! Появилась небольшая задержка в отображении картинки с камеры, а это то что нам нужно!
Теперь можем издеваться над изображением. Во первых скалим его до разрешения 480х640. Потом берем сжатие по стандарту JPEG, наваливаем 50% качества
Эфект шакалинга практически отсутствует. Неужели наши деды сжимали фотки еще сильнее?! Ну ок, пробуем 15% сжатие (то есть15% сохранения качества)
Это уже пойдет. Но для готовых сохраненных фоток. А на видеозапись и особенно само лайф превью камеры на экране нам необходимо спуститься на самое дно. 8% !
То. Что. Нужно. Для начала. Прекрасно сжалась цветовая гамма, образовалось множество участков слитых в один оттенок - типо пикселей. Но не хватает души. Точнее шума.
Насколько я понимаю - шум на изображениях появлялся из за особенностей работы самой матрицы камеры. На современных устройствах все эти проблемы решаются где то на аппаратном уровне либо самими матрицами, и нам из высокоуровневой разработки туда добираться очень долго, если вообще возможно.
А еще не резонно. Потому что можно нарисовать шум самим! Берем битмап исходной картинки (матрица 640 на 480 пикселей), и накладываем сверху другой битмап - на котором случайные пиксели случайно заполнили красным, зеленым или синим. В итоге получается тот самый шум:
На данную операцию с каждым кадром видеопотока с камеры и выводом картинки на экран, тратится крайне мало времени - фпс практически не изменился. Меня это не устраивает, я точно помню что на сони эриксоне картинка с камеры тормозила. Добавляем на каждом кадре паузу в 0.050с! Теперь аутентично
Осталось сохранять готовые файлы при нажатии на кнопки. С фото всё крайне просто - упаковываем битмап сразу в файл, паттерны имен фотографий с тех пор у нас вроде не изменились. С видео сохранение чуть сложнее, но об этом расскажу потом (возможно), со следующими интересными обновлениями.
Для заинтересованных организован телеграм канал с новостями и обсуждением работы (шлите свои баги туда пожалуйста)
В гуглплей приложения скорее всего не будет никогда, зато есть на православных:
RuStore
App Gallery
АПК файл прямо в канале
Традиционно на MVP ушло 2 дня вместо одного, но оно работает и снимает и даже бесплатно.