MVP за день. Бесплатный 0.3MP Camera на андроид. LowCam

Дошел до меня тренд из твитера, с шакальными видео как в старых телефонах, оказалось на андроид почти неработает и денег стоит. Я сделал свое
LowCam 0.4MP . Кому просто скачать, а не читать:

App Gallery
RuStore
АПК файл прямо в канале

И вот, в рамках "MVP за день" челенжа, который сам себе придумал, сделал клон приложения 0.3MP Camera (снимает фото\видео в формате старинных кнопочных телефонов), на андоид. Прикиньте, в их андроид версии даже видео нельзя снимать. А фото можно сделать бесплатно только 10 штук (включая скриншоты, sic), потом плоти.

Значит взял я свой любимый Kotlin, подключил стоковые инструменты отображения картинки с камеры, сьемки фото и видео, согласно первому актуальному гайду гугла (CameraX). И стал думать как это всё зашакалить (добавить эффекты старомодных сжатий) - до попадания на файлы фоток и на само превью. И вот что понял:

Никак

Дело в том, что стоковые инструменты на то и стоковые, что они максимально казуальные. А лезть в низкоуровневые альтернативы страшно - это точно растянет разработку на несколько дней.

Решено довольствоваться простым советским Bitmap(примитивная матрица пикселей), который CameraX может отдавать по каждому кадру.

Заменяем удобный автоматический PreviewView(какой то магией показывает изображение с камеры) на обычный ImageView (в ваших приложениях все картинки выводятся в них), и загружаем в него каждый приходящий с камеры битмап - превью экран камеры работает, а под нашим контролем теперь каждый пиксель этого видеопотока! Появилась небольшая задержка в отображении картинки с камеры, а это то что нам нужно!

Пациент № 0
Пациент № 0

Теперь можем издеваться над изображением. Во первых скалим его до разрешения 480х640. Потом берем сжатие по стандарту JPEG, наваливаем 50% качества

На современных техно с фронталки хуже качество.. 
На современных техно с фронталки хуже качество.. 

Эфект шакалинга практически отсутствует. Неужели наши деды сжимали фотки еще сильнее?! Ну ок, пробуем 15% сжатие (то есть15% сохранения качества)

достойно
достойно

Это уже пойдет. Но для готовых сохраненных фоток. А на видеозапись и особенно само лайф превью камеры на экране нам необходимо спуститься на самое дно. 8% !

идеально
идеально

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

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

А еще не резонно. Потому что можно нарисовать шум самим! Берем битмап исходной картинки (матрица 640 на 480 пикселей), и накладываем сверху другой битмап - на котором случайные пиксели случайно заполнили красным, зеленым или синим. В итоге получается тот самый шум:

сочно
сочно

На данную операцию с каждым кадром видеопотока с камеры и выводом картинки на экран, тратится крайне мало времени - фпс практически не изменился. Меня это не устраивает, я точно помню что на сони эриксоне картинка с камеры тормозила. Добавляем на каждом кадре паузу в 0.050с! Теперь аутентично

Осталось сохранять готовые файлы при нажатии на кнопки. С фото всё крайне просто - упаковываем битмап сразу в файл, паттерны имен фотографий с тех пор у нас вроде не изменились. С видео сохранение чуть сложнее, но об этом расскажу потом (возможно), со следующими интересными обновлениями.

Для заинтересованных организован телеграм канал с новостями и обсуждением работы (шлите свои баги туда пожалуйста)

В гуглплей приложения скорее всего не будет никогда, зато есть на православных:
RuStore
App Gallery
АПК файл прямо в канале

Традиционно на MVP ушло 2 дня вместо одного, но оно работает и снимает и даже бесплатно.

5
13 комментариев