2013-04-26 29 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

相关问题