2010-07-31 48 views
7

我正在編寫一個應用程序來捕獲相機預覽幀並將其轉換爲Android中的位圖。這是我的代碼:如何在Android編程中從Camera Application捕獲預覽圖像幀?

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時,我做錯了什麼?

+0

同樣的問題http://stackoverflow.com/questions/3338235/bitmapfactory-decodebytearray-is-returning-null(未應答ATOW) – OJW 2010-08-15 12:32:29

+0

可能的複製[在Android中從視頻圖像獲取幀](http://stackoverflow.com/questions/1893072/getting-frames-from-video-image-in-android) – Tim 2016-04-07 02:37:52

回答

1

在使用BitmapFactory之前,您是否嘗試將預覽幀數據解碼爲RGB?默認格式是YUV,我不確定是否與BitmapFactory兼容。戴夫Manpearl的解碼方法可以在這裏找到:

Getting frames from Video Image in Android

讓我知道,如果它的工作原理。

乾杯,

保羅

16

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(); 
     } 
    } 
} 

另取圖片的方式,檢查本文how to use camera in android

相關問題