2013-04-26 63 views
0

編輯照片:我發現這個問題是在onPreviewFrame功能:如何保存從攝像頭的Android

@Override 
    public void onPreviewFrame(byte[] data, Camera camera) { 
     if (frameCount == 0) { 
      start = System.currentTimeMillis(); 
     } else if (frameCount % 100 == 0) { 
      Log.e("FPS", 1000 * frameCount 
        /(System.currentTimeMillis() - start) + ""); 
     } 
     frameCount++; 
     Bitmap temp = BitmapFactory.decodeByteArray(data, 0, data.length); 
     try { 
      temp.compress(CompressFormat.JPEG, 90, new FileOutputStream(new File("/sdcard/"+frameCount+".jpg"))); 
     } catch (FileNotFoundException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     camera.addCallbackBuffer(data); 
    } 

如果我刪除所有位圖,則程序可以拍照沒有任何錯誤相關的代碼。我怎樣才能保存幀圖像和使用Camera.takePicture生成的更好的圖像? 當按下按鈕時,我嘗試保存照相機中的照片,並開始另一個活動以編輯照片。

mTakePic.setOnTouchListener(new OnTouchListener() { 

      @Override 
      public boolean onTouch(View v, MotionEvent event) { 
       if (event.getAction() == MotionEvent.ACTION_DOWN) { 
        mTakePic.setImageDrawable(takePicDown); 
        mCamera.takePicture(new ShutterCallback() { 

         @Override 
         public void onShutter() { 
          // TODO Auto-generated method stub 

         } 
        }, null, new PictureCallback() { 


         @Override 
         public void onPictureTaken(byte[] yuv, Camera camera) { 
          Intent editImage = new Intent(getApplicationContext(), EditActivity.class); 

          if(savePhoto != null) { 
           try { 
            savePhoto.get(); 
           } catch (InterruptedException e) { 
            // TODO Auto-generated catch block 
            e.printStackTrace(); 
           } catch (ExecutionException e) { 
            // TODO Auto-generated catch block 
            e.printStackTrace(); 
           } 
          } 
          savePhoto = new SavePhotoTask(); 
          savePhoto.execute(yuv); 

//       releaseCamera(); 
          startActivity(editImage); 
         } 
        }); 
       } else if (event.getAction() == MotionEvent.ACTION_UP) { 
        mTakePic.setImageDrawable(takePicUp); 
       } 
       return true; 
      } 
     }); 

有時它順利運行沒有錯誤,但大多數時候它結束了一個錯誤,我不得不重新啓動我的電話讓相機重新工作。我使用了SurfaceView來預覽相機畫面。

回答

1

編輯:對不起,我錯誤的問題,我以爲你是連接你提到的SavePhotoTask崩潰。以下是如何從PictureCallback保存照片

onPictureTaken的第一個參數是一個包含圖像的字節數組。簡單地將它寫入文件是我發現保存圖像的最佳方式。事情是這樣的......

FileOutputStream out = new FileOutputStream("path/to/image"); 
out.write(data, 0, data.length); 
out.close(); 

其中,「數據」是從onPictureTaken的第一個參數。這同樣的技術應該可以保存每個幀在onPreviewFrame,但我從來沒有嘗試過,所以我不能確定。您似乎有想將此操作放在單獨的線程上,這非常出色,我會繼續探索該選項。但是,我會避免使用位圖,因爲這需要時間和資源,並且如果要同時轉換多個幀並將所有這些位圖存儲在內存中,則可能會導致OOM錯誤。


一旦你撥打電話到Camera.open(),您的應用程序將相機上的鎖,並使用它,阻止任何其他應用程序(包括你自己的應用程序的後續實例)。當您的應用程序完成或照相機將保持鎖定狀態時,必須撥打Camera.release(),直到您注意到手機重新啓動。 The dev docs for the Camera has a good checklist to follow at the top in order to ensure the class gets used correctly.

我已經成功進行調用Camera.open()onResume()Camera.release()onPause()。爲了讓事情保持平穩和無故障,您可能需要在這些點上管理您的開始和停止預覽。

+0

謝謝@MattDavis,但這不是我的問題的答案。我編輯了這個問題,請看看它 – 2013-04-26 19:09:19

+0

我已經編輯了我的回答,以顯示如何保存,請告訴我是否有幫助。 – MattDavis 2013-04-29 17:16:47

相關問題