0

メイン アクティビティ内のフレーム レイアウトでカメラをプレビューできる Android カメラ アプリケーションをセットアップしました。私がやりたいこと (カメラ固有の機能を使用せずに、これをハードウェアから完全に独立させたい) は、ピクセルの周りにボックスを表示するか、すべてをぼかして、プレビューの中央にある 150 X 150 ピクセルのアウトラインです。 150 x 150 以外のピクセル。さらに、写真を撮らずに、これらのピクセルを読み取りたいと思います。最終的に私が目指している効果は、カメラを動かすと、150 x 150 の領域内の赤、緑、青の色濃度の変化を表示することです。ネストされた for ループを実行してピクセルから色を取得する方法は知っていますが、高さと重量のオフセットを取得してピクセルの読み取りを開始する方法を知る必要があります。ご協力いただきありがとうございます。マイク

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");

    }
4

1 に答える 1

1

「ピクセルの読み取りを開始するには、高さと重さのオフセットを取得する方法を知る必要があります」

ネストされた for ループのオフセットを取得する簡単な方法は、説明的な変数を使用して説明します。

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
    }
}

previewWidth と previewHeight は、surfaceChange() から簡単に取得できます。

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

ここで多くの変数を使用する理由は、私がこの問題をどのように解決したかを明確に理解できるようにするためです。

それがどうなるか教えてください。

于 2012-09-17T23:36:19.320 に答える