Я понимаю, что этот ответ немного запоздал, но вот что я узнал за последний месяц, работая с камерой.
вы ресивер ли необработанные данные изображений через onPictureTaken или onPreviewFrame он может прийти закодированные в sereral различных форматов (android.graphics.ImageFormat). Единственной гарантированной универсальной поддержкой (согласно документам) является NV21, YV12 повсеместно поддерживается сотой и вверх. Помимо универсальной поддержки, NV21 может хорошо вписываться в то, что вы пытаетесь сделать (конвертировать в черно-белый). NV21 - это формат YUV, где Y-канал содержит информацию о яркости, в то время как каналы U и V содержат информацию о цвете. Смотрите более формальное описание здесь:
http://en.wikipedia.org/wiki/YUV
http://www.fourcc.org/fccyvrgb.php
http://www.fourcc.org/yuv.php#NV21
Ссылка вики имеет источник образца, который достигает преобразования NV21-> RGB (не очень эффективно, как есть, но дает хорошее представление о Основной подход). Если вы заинтересованы в этом преобразовании на C или сборке, это был хороший источник информации (предупреждение: кода NV21 нет, и мои быстрые модификации для обработки NV21 не привели к чему-либо хорошему). Тем не менее, он показывает, как включить файлы .S в проекты ndk, что на самом деле очень просто.
http://www.roman10.net/effective-color-conversion-yuv-rgb-in-android-in-assembly/
Возвращаясь к вашему вопросу - преобразование в B/W. Просто возьмите Y-канал и сформируйте RGB в три раза как [Y, Y, Y], и это даст вам черно-белое изображение. Или просто просто сделайте из него L8-образ (например, Y-> L).
PS. Существует много путаницы относительно диапазона/масштабирования значений YUV во время преобразования в RGB. Я обнаружил, что данные камеры поступают полным ходом (0-255, а не 16-235 или 16-240), и что прижатие результата к 0-255 после умножения матрицы дает визуально приятный результат, а масштабирование до 0-255 искажений цвета (разумеется, это все еще верно, если вы масштабируетесь в другом диапазоне, например 16-240). Эти наблюдения, похоже, противоречат некоторым более тонким аспектам процедуры полного преобразования, описанной в ссылках выше, но это то, что я нашел для работы.
вам нужно использовать 'onPictureTaken' или вы могли бы использовать для предварительного просмотра обратного вызова,' onPreviewFrame' ли? –
Ну, мне не нужно обрабатывать изображения во время предварительного просмотра, только после того, как изображение будет снято. В чем разница в параметрах? – Vitaly
'onPictureTaken' передает изображение в формате JPG,' onPreviewFrame' передает необработанные данные YUV. –