0

私は次のコードを持っています.私がやろうとしているのは、写真を撮った瞬間に R.layout.overlay にある画像が写真のキャプチャに表示されることです。写真を撮る前のプレビューの瞬間に、表示される画像を細かく制御します。R.layout.overlayに画像がなくても、写真を撮るときにこの原因をどうするかわかりません。または、いくつかのコードでスクリーンショットを撮る方法はありますか? それは私が考えていた他のオプションですが、これの問題は、写真が画面の解像度のサイズになることです。

これは私のコードです:

@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

        getWindow().setFormat(PixelFormat.UNKNOWN);
        surfaceView = (SurfaceView)findViewById(R.id.camerapreview);
        surfaceHolder = surfaceView.getHolder();
        surfaceHolder.addCallback(this);
        surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

        drawingView = new DrawingView(this);
        LayoutParams layoutParamsDrawing 
            = new LayoutParams(LayoutParams.FILL_PARENT, 
                    LayoutParams.FILL_PARENT);
        this.addContentView(drawingView, layoutParamsDrawing);

        controlInflater = LayoutInflater.from(getBaseContext());
        View viewControl = controlInflater.inflate(R.layout.control, null);
        LayoutParams layoutParamsControl = new LayoutParams(LayoutParams.FILL_PARENT, 
                    LayoutParams.FILL_PARENT);
        this.addContentView(viewControl, layoutParamsControl);

        inflater = LayoutInflater.from(getBaseContext());
         View view = inflater.inflate(R.layout.overlay, null);
         LayoutParams layoutParamsControl2= new LayoutParams(LayoutParams.FILL_PARENT, 
                 LayoutParams.FILL_PARENT);
         this.addContentView(view, layoutParamsControl2);

        buttonTakePicture = (Button)findViewById(R.id.takepicture);
        buttonTakePicture.setOnClickListener(new Button.OnClickListener(){

            @Override
            public void onClick(View arg0) {
                // TODO Auto-generated method stub
                camera.takePicture(myShutterCallback, myPictureCallback_RAW, myPictureCallback_JPG);
            }});

        LinearLayout layoutBackground = (LinearLayout)findViewById(R.id.background);
        layoutBackground.setOnClickListener(new LinearLayout.OnClickListener(){

            @Override
            public void onClick(View arg0) {
                // TODO Auto-generated method stub

                buttonTakePicture.setEnabled(false);
                camera.autoFocus(myAutoFocusCallback);
            }});

        prompt = (TextView)findViewById(R.id.prompt);
    }


    //Termina onCreate

    FaceDetectionListener faceDetectionListener
    = new FaceDetectionListener(){

        @Override
        public void onFaceDetection(Face[] faces, Camera camera) {

            if (faces.length == 0){
                prompt.setText(" No Face Detected! ");
                drawingView.setHaveFace(false);
            }else{
                prompt.setText(String.valueOf(faces.length) + " Face Detected :) ");
                drawingView.setHaveFace(true);
                detectedFaces = faces;
            }

            drawingView.invalidate();

        }};

    AutoFocusCallback myAutoFocusCallback = new AutoFocusCallback(){

        @Override
        public void onAutoFocus(boolean arg0, Camera arg1) {
            // TODO Auto-generated method stub
            buttonTakePicture.setEnabled(true);
        }};

    ShutterCallback myShutterCallback = new ShutterCallback(){

        @Override
        public void onShutter() {
            // TODO Auto-generated method stub

        }};

    PictureCallback myPictureCallback_RAW = new PictureCallback(){

        @Override
        public void onPictureTaken(byte[] arg0, Camera arg1) {
            // TODO Auto-generated method stub

        }};

    PictureCallback myPictureCallback_JPG = new PictureCallback(){

        @Override
        public void onPictureTaken(byte[] arg0, Camera arg1) {
            // TODO Auto-generated method stub
            /*Bitmap bitmapPicture 
                = BitmapFactory.decodeByteArray(arg0, 0, arg0.length);  */

            Uri uriTarget = getContentResolver().insert(Media.EXTERNAL_CONTENT_URI, new ContentValues());

            OutputStream imageFileOS;
            try {
                imageFileOS = getContentResolver().openOutputStream(uriTarget);
                imageFileOS.write(arg0);
                imageFileOS.flush();
                imageFileOS.close();

                prompt.setText("Image saved: " + uriTarget.toString());

                Toast.makeText(AndroidCamera.this, "Saved", Toast.LENGTH_LONG).show();

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

            camera.startPreview();
            camera.startFaceDetection();
        }};

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width,
            int height) {
        // TODO Auto-generated method stub
        if(previewing){
            camera.stopFaceDetection();
            camera.stopPreview();
            previewing = false;
        }

        if (camera != null){
            try {
                camera.setPreviewDisplay(surfaceHolder);
                camera.startPreview();

                prompt.setText(String.valueOf(
                        "Max Face: " + camera.getParameters().getMaxNumDetectedFaces()));
                camera.startFaceDetection();
                previewing = true;
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        // TODO Auto-generated method stub
        camera = Camera.open();
        camera.setFaceDetectionListener(faceDetectionListener);
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        // TODO Auto-generated method stub
        camera.stopFaceDetection();
        camera.stopPreview();
        camera.release();
        camera = null;
        previewing = false;
    }

    private class DrawingView extends View{

        boolean haveFace;
        Paint drawingPaint;

        public DrawingView(Context context) {
            super(context);
            haveFace = false;
            drawingPaint = new Paint();
            drawingPaint.setColor(Color.GREEN);
            drawingPaint.setStyle(Paint.Style.STROKE); 
            drawingPaint.setStrokeWidth(2);
        }

        public void setHaveFace(boolean h){
            haveFace = h;
        }

        @Override
        protected void onDraw(Canvas canvas) {
            // TODO Auto-generated method stub
            if(haveFace){

                // Camera driver coordinates range from (-1000, -1000) to (1000, 1000).
                 // UI coordinates range from (0, 0) to (width, height).

                 int vWidth = getWidth();
                 int vHeight = getHeight();

                for(int i=0; i<detectedFaces.length; i++){

                    int l = detectedFaces[i].rect.left;
                    int t = detectedFaces[i].rect.top;
                    int r = detectedFaces[i].rect.right;
                    int b = detectedFaces[i].rect.bottom;
                    int left    = (l+1000) * vWidth/2000;
                    int top     = (t+1000) * vHeight/2000;
                    int right   = (r+1000) * vWidth/2000;
                    int bottom  = (b+1000) * vHeight/2000;
                    canvas.drawRect(
                            left, top, right, bottom,  
                            drawingPaint);
                }
            }else{
                canvas.drawColor(Color.TRANSPARENT);
            }
        }

    }
4

1 に答える 1

0

ボタンの組み合わせを物理的に押すことで、携帯電話のスクリーンショットを撮ることができます。したがって、おそらくどこかでコールバックをオーバーライドすることにより、プログラムでこれを行う方法があるはずです。ここを確認してください:Androidでプログラムでスクリーンショットを撮る方法は?

ただし、スクリーンショットを撮っている場合、画像は携帯電話のディスプレイと同じ解像度になり、古いデバイスでは非常に低い場合があることに注意してください。カメラで撮影した写真は、はるかに優れた解像度になります。2 つの画像を結合するだけで、撮影した写真に画像を追加することができます。

于 2013-07-19T02:50:05.203 に答える