Как захватить кадры предварительного просмотра из приложения камеры в программировании Android? - PullRequest
9 голосов
/ 31 июля 2010

Я пишу приложение для захвата кадров предварительного просмотра камеры и преобразования его в растровое изображение в Android. Вот мой код:

   Camera.PreviewCallback previewCallback = new Camera.PreviewCallback()  
    { 
            public void onPreviewFrame(byte[] data, Camera camera)  
            { 
                    try 
                    { 
                            BitmapFactory.Options opts = new BitmapFactory.Options(); 
                            Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);//,opts); 
                    } 
                    catch(Exception e) 
                    {

                    } 
            } 

    }; 

    mCamera = Camera.open();
    mCamera.setPreviewCallback(previewCallback); 

После запуска предварительного просмотра вызывается обратный вызов с данными, но растровое изображение является нулевым.

Что я сделал не так при преобразовании байтового массива в BitMap?

Ответы [ 2 ]

18 голосов
/ 07 августа 2012

В функции onPreviewFrame() вы должны сначала проверить формат изображения.Это пример NV21.

public void onPreviewFrame(byte[] data, Camera camera) 
{
    Parameters parameters = camera.getParameters();
    imageFormat = parameters.getPreviewFormat();
    if (imageFormat == ImageFormat.NV21)
    {
        Rect rect = new Rect(0, 0, PreviewSizeWidth, PreviewSizeHeight); 
        YuvImage img = new YuvImage(data, ImageFormat.NV21, PreviewSizeWidth, PreviewSizeHeight, null);
        OutputStream outStream = null;
        File file = new File(NowPictureFileName);
        try 
        {
            outStream = new FileOutputStream(file);
            img.compressToJpeg(rect, 100, outStream);
            outStream.flush();
            outStream.close();
        } 
        catch (FileNotFoundException e) 
        {
            e.printStackTrace();
        }
        catch (IOException e) 
        {
            e.printStackTrace();
        }
    }
}

Для другого способа сделать снимок, прочитайте эту статью: Как использовать камеру в Android

1 голос
/ 29 августа 2010

Вы пытались декодировать данные кадра предварительного просмотра в RGB перед использованием BitmapFactory?Формат по умолчанию - YUV, который, я не уверен, совместим с BitmapFactory.Метод декодирования Дэйва Мэнпирла можно найти здесь:

Получение кадров из видеоизображения в Android

Дайте мне знать, если он работает.1009 *

Пол

...