0

I have set up an Android camera application that allows me to preview the camera in a Frame Layout within my main Activity. What I would like to do (without using camera specific functionality; I want this to be completely independent of hardware.) is out line 150 X 150 pixels in the center of the preview either by showing a box around the pixels or blurring all of the pixels except the 150 x 150. Additionally, without taking a picture, I would like to read these pixels. Ultimately the effect I am going for is, as the camera is moved I display the change in the red, green, and blue color concentrations within the 150 x 150 area. I know how to do the nested for loop and get the color from the pixel, but I would need to know how to get the offset for the height and weight to start reading the pixels from. Thanks in advance for all of your help! Mike

public class MyActivity extends Activity {
    final public String TAG = "MyActivity";
    static private Camera mCamera = null;
    static public Camera getCamera() { return mCamera; }
    private static boolean mBPreviewingCamera = false;
    private PreviewSurface mPS;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        String lMTH = "onCreate ";
        Log.i(TAG, lMTH + "Start");
        setContentView(R.layout.activity_color_temperature_estimator);
        if (isThereACamera()) {
            mPreviewCamera(true);
            TextView lTVTemp = (TextView) findViewById(R.id.TV_TEMP);
            lTVTemp.setText("Camera exists able to proceed");
            lTVTemp = null;
        } else {
            Toast.makeText(this, "No camera! Uunable to proceed", Toast.LENGTH_LONG).show();
            TextView lTVTemp = (TextView) findViewById(R.id.TV_TEMP);
            lTVTemp.setText("No camera! Uunable to proceed");
            lTVTemp = null;
        }
    }

    public void mPreviewCamera(boolean pBPreviewingCamera) {
        String lMTH = "mPreviewCamera ";
        try {
            if (pBPreviewingCamera) {
                Log.i(TAG, lMTH + "Open Camera");
                mCamera = Camera.open();
                mPS = new PreviewSurface(this);
                FrameLayout lFVPreview = (FrameLayout) findViewById(R.id.FL_Preview);
                lFVPreview.addView(mPS);
                lFVPreview = null;

                mBPreviewingCamera = true;
                Button lBTNTemp = (Button) findViewById(R.id.BTN_CLOSE);
                lBTNTemp.setText(R.string.BTN_CLOSE);
                lBTNTemp = null;
            } else {
                Log.i(TAG, lMTH + "Open Camera");
                mCloseCamera();
                Button lBTNTemp = (Button) findViewById(R.id.BTN_CLOSE);
                lBTNTemp.setText(R.string.BTN_OPEN);
                lBTNTemp = null;
            }

        } catch (Exception e) {
            Log.i(TAG, lMTH + e.getMessage());
            mCloseCamera();
            e.printStackTrace();
        }
    }


    public void mCloseCamera() {
        String lMTH = "mCloseCamera ";
        Log.i(TAG, lMTH + "Turn Camera Off");
        if (mCamera != null) {
            mCamera.stopPreview();
            mCamera.release();
        }
        mCamera = null;
        mBPreviewingCamera = false;
    }


    @Override
    protected void onPause() {
        // TODO Auto-generated method stub
        super.onPause();
        String lMTH = "onPause ";
        Log.i(TAG, lMTH + "Turn Camera Off");
        mPreviewCamera(false);
    }

    @Override
    protected void onDestroy() {
        // TODO Auto-generated method stub
        super.onDestroy();
        String lMTH = "onDestroy ";
        Log.i(TAG, lMTH + "Turn Camera Off");
        mPreviewCamera(false);
    }

    /** Check if this phone has a camera */
    private boolean isThereACamera() {
        if (getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA)){
            // There is a camera
            return true;
        } else {
            // There isn't a camera
            return false;
        }
    }

    public void mBTN(View view) {
        mPreviewCamera(!mBPreviewingCamera);
    }
}




public class PreviewSurface extends SurfaceView implements SurfaceHolder.Callback  {
    final static public String TAG = "PreviewSurface";
    private SurfaceHolder mSH;

    /**
     * @param context
     */
    public PreviewSurface(Context pContext) {
        super(pContext);
        // TODO Auto-generated constructor stub
        String lMTH = "PreviewSurface(Context pContext) ";
        Log.i(TAG, lMTH + "Constructor");

        pContext = null;
        mSH = getHolder();
        mSH.addCallback(this);
        mSH.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

    }


    /* (non-Javadoc)
     * @see android.view.SurfaceHolder.Callback#surfaceChanged(android.view.SurfaceHolder, int, int, int)
     */
    public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {
        String lMTH = "surfaceChanged ";
        // TODO Auto-generated method stub
        Log.i(TAG, lMTH + "arg1 = " + arg1 + " arg2 " + arg2 + " arg3 " + arg3);
        if (arg0.getSurface() != null) {
            // stop old preview if it exists
            try {
                Log.i(TAG, lMTH + "Stop Preview ");
                MyActivity.getCamera().stopPreview();
            } catch (Exception e) {
                Log.i(TAG, lMTH + "Stoping preview exception " + e.getMessage());

            }

            // start new preview
            try {
                Log.i(TAG, lMTH + "Set Preview ");
                MyActivity.getCamera().setPreviewDisplay(arg0);
                Log.i(TAG, lMTH + "Start Preview ");
                MyActivity.getCamera().startPreview();

            } catch (Exception e){
                Log.i(TAG, lMTH + "Starting camera preview exception " + e.getMessage());
            }
          }

          // stop preview before making changes

    }

    /* (non-Javadoc)
     * @see android.view.SurfaceHolder.Callback#surfaceCreated(android.view.SurfaceHolder)
     */
    public void surfaceCreated(SurfaceHolder arg0) {
        String lMTH = "surfaceCreated ";
        // TODO Auto-generated method stub
        try {
            Log.i(TAG, lMTH + "Set Preview ");
            MyActivity.getCamera().setPreviewDisplay(arg0);
            Log.i(TAG, lMTH + "Start Preview ");
            MyActivity.getCamera().startPreview();
        } catch (Exception e) {
            Log.i(TAG, lMTH + "Exception " + e.getMessage());
            e.printStackTrace();
        }

    }

    /* (non-Javadoc)
     * @see android.view.SurfaceHolder.Callback#surfaceDestroyed(android.view.SurfaceHolder)
     */
    public void surfaceDestroyed(SurfaceHolder arg0) {
        String lMTH = "surfaceDestroyed ";
        // TODO Auto-generated method stub
        Log.i(TAG, lMTH + "Activity will handle destroy");

    }
MikeM
  • 1
  • 1

1 Answers1

1

"I would need to know how to get the offset for the height and weight to start reading the pixels from"

An easy way to get the offset for your nested for-loop is walked through with descriptive variables:

int xWidth = 150; // The length you want to concentrate on
int yHeight = 150;
int xCenter = previewWidth/2;
int yCenter = previewHeight/2;
int xStart = xCenter - xWidth/2;
int xEnd = xCenter + xWidth/2;
int yStart = yCenter - yHeight/2;
int yEnd = yCenter + yHeight/2;

for(int y = yStart; y < yEnd; y++) {
    for(int x = xStart; x < xEnd; x++) {
        // read pixels
    }
}

The previewWidth and previewHeight can be easily gotten from surfaceChange():

public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
    previewWidth = w;
    previewHeight = h;
    ...
}

The reason I use many variables here is so that you can clearly see how I walked through this problem.

Let me know how it goes.

Anonsage
  • 7,194
  • 3
  • 41
  • 50