Хорошо задокументировано, что данные предварительного просмотра камеры Android возвращаются обратно в NV21 (YUV 420).2.2 добавлен класс YuvImage для декодирования данных.Проблема, с которой я столкнулся, заключается в том, что данные класса YuvImage выглядят поврежденными или неверными.Я использовал приложение Renderscript Sample под названием HelloCompute, которое превращает растровое изображение в одноцветное растровое изображение.Я использовал два метода для декодирования данных предварительного просмотра в растровое изображение и передачи их в качестве входных данных для Renderscript:
Метод 1 - Android YuvImage Class:
YuvImage preview = newYuvImage (data, ImageFormat.NV21, width, height, null);
ByteArrayOutputStream mJpegOutput = new ByteArrayOutputStream (data.length);
preview.compressToJpeg (новый Rect (0, 0, ширина, высота), 100, mJpegOutput);mBitmapIn = BitmapFactory.decodeByteArray (mJpegOutput.toByteArray (), 0, mJpegOutput.size ());
// передать mBitmapIn в RS
Метод 2 - метод объявленного декодера: Как опубликовано здесь Дэвидом Перлманом
// обходной путь для формата Yuv
mBitmapIn = Bitmap.createBitmap (ImageUtil.decodeYUV420SP (данные, ширина, высота), ширина,height, Bitmap.Config.ARGB_8888);
// передача mBitmapIn в RS
Когда изображение обрабатывается с помощью Renderscript и отображается метод 1 очень зернистый и не монохромный, в то время как Метод 2 дает ожидаемый вывод , монохромное изображение кадра предварительного просмотра.Я делаю что-то не так или класс YuvImage не используется?Я тестирую это на Xoom под управлением 3.1.
Кроме того, я отображал растровые изображения, созданные обоими методами, на экране перед передачей в RS.Растровое изображение из метода 1 имеет заметные различия в освещении (я подозревал, что это произошло из-за сжатия JPeg), в то время как растровое изображение метода 2 идентично кадру предварительного просмотра.