2011-04-28 75 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時纔有效