2010-07-31 39 views
7

Tôi đang viết một ứng dụng để chụp các khung xem trước của máy ảnh và chuyển đổi nó thành bitmap trong Android. Đây là mã của tôi:Làm cách nào để chụp khung hình xem trước từ Ứng dụng Máy ảnh trong Lập trình 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); 

Sau khi tôi bắt đầu xem trước, cuộc gọi lại được gọi với dữ liệu, nhưng bitmap là rỗng.

Tôi đã làm gì sai khi chuyển đổi mảng byte thành BitMap?

+0

Cùng câu hỏi như http://stackoverflow.com/questions/3338235/bitmapfactory-decodebytearray-is-returning-null (ATOW chưa được trả lời) – OJW

+0

có thể trùng lặp trong số [Nhận khung hình từ Video Image trong Android] (http://stackoverflow.com/questions/1893072/getting-frames-from-video-image-in-android) – Tim

Trả lời

1

Bạn đã thử giải mã dữ liệu khung xem trước thành RGB trước khi sử dụng BitmapFactory chưa? Định dạng mặc định là YUV mà tôi không chắc là tương thích với BitmapFactory. phương pháp giải mã Dave Manpearl có thể được tìm thấy ở đây:

Getting frames from Video Image in Android

Hãy cho tôi biết nếu nó hoạt động.

Chúc mừng,

Paul

16

Trong onPreviewFrame() chức năng, bạn nên kiểm tra định dạng hình ảnh đầu tiên.
Ví dụ NV21 này.

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

Một cách khác để chụp hình, kiểm tra bài viết này how to use camera in android

Các vấn đề liên quan