2011-04-28 78 views
1

这是我第一次在Android上编程,更多的我不是那么熟悉java的programmation。我试图通过互联网找到我的问题的答案,但没有找到任何解决方案。我希望你们中的一个能够帮助我。 我想要做的是实时应用一些图像处理到摄像机并显示它。这就是为什么我使用onPreviewFrame函数在显示结果之前进行一些图像处理的原因。请告诉我,如果这不是最好的方法。我的问题是,当我尝试修改数据数组时,屏幕上没有任何更改。从我看到的调试器中调用该函数。所有这些都是用2.1 API完成的。onPreviewFrame不会改变数据

有人知道为什么吗?我该如何解决这个问题?

帮助,这里是我的代码:

import android.app.Activity; 
import android.content.Context; 
import android.hardware.Camera; 
import android.os.Bundle; 
import android.view.SurfaceHolder; 
import android.view.SurfaceView; 
import android.view.Window; 
import java.io.IOException; 

// ---------------------------------------------------------------------- 

public class CameraPreview extends Activity {  
    private Preview mPreview; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     // Hide the window title. 
     requestWindowFeature(Window.FEATURE_NO_TITLE); 

     // Create our Preview view and set it as the content of our activity. 
     mPreview = new Preview(this); 
     setContentView(mPreview); 
    } 

} 

// ---------------------------------------------------------------------- 

class Preview extends SurfaceView implements SurfaceHolder.Callback, Camera.PreviewCallback { 
    SurfaceHolder mHolder; 
    Camera mCamera; 

    Preview(Context context) { 
     super(context); 

     // Install a SurfaceHolder.Callback so we get notified when the 
     // underlying surface is created and destroyed. 
     mHolder = getHolder(); 
     mHolder.addCallback(this); 
     mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
    } 

    public void surfaceCreated(SurfaceHolder holder) { 
     // The Surface has been created, acquire the camera and tell it where 
     // to draw. 

     mCamera = Camera.open(); 
     try { 
      mCamera.setPreviewDisplay(holder);  
      mCamera.setPreviewCallback(this); 

     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 


    } 


    public void onPreviewFrame(byte[] data, Camera camera) { 
     if (data != null) { 
      for(int i=0;i<data.length;i++){ 
       data[i] = 0; 
      } 
     } 

    } 


    public void surfaceDestroyed(SurfaceHolder holder) { 
     // Surface will be destroyed when we return, so stop the preview. 
     // Because the CameraDevice object is not a shared resource, it's very 
     // important to release it when the activity is paused. 
     mCamera.stopPreview(); 
     mCamera.release(); 
     mCamera = null; 
    } 

    public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { 
     // Now that the size is known, set up the camera parameters and begin 
     // the preview. 
     Camera.Parameters parameters = mCamera.getParameters(); 
     parameters.setPreviewSize(w, h); 
     mCamera.setParameters(parameters); 
     mCamera.startPreview(); 
    } 

} 

谢谢你的帮助, 摩根科米尔

回答

2

嘿!传入onPreviewFrame的缓冲区(byte []数据)是相机帧缓冲区的副本,因此在绘制相机预览时不会反映对其的任何修改。

我刚才刚刚开始使用Android开发,但AFAIK最好的选择是取该缓冲区并将其绘制到另一个 SurfaceView,例如,到一个openGL表面。我抓起应该证明这一点的例子:

http://nhenze.net/?p=154

下面这个例子中,你可以把你的图像数据,进行一些处理,然后渲染它。如果你喜欢(AFAIK--我没有在Android上自己尝试过),你总是可以用GL中的像素着色器来进行图像处理。

希望有帮助!

2

对我来说,只有在SurfaceChanged的方法中安装PreviewCallback时才有效