如何裁剪图像与模板的坐标的帮助 [英] How to crop image with the help of co-ordinates of template

查看:187
本文介绍了如何裁剪图像与模板的坐标的帮助的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在我的项目,我使用嵌套的的FrameLayout 。我有活动的布局:

In my project, I am using nested FrameLayout. I have layout of activity as:

<FrameLayout>   ---------(1)
  <SurfaceView>
     <FrameLayout> ------(2)
  </SurfaceView>
</FrameLayout>

的FrameLayout(2)显示模板。该活动捕获的图像具有自定义相机API。该用户应该以适合刘晓丹的对象的FrameLayout的模板(2)。图像被拍摄之后,我想裁剪该图像,使得仅被安装在模板中的所关注对象是可用的。原始图像由该裁剪出的图像重写。

FrameLayout(2)shows a template. The activity captures image with custom camera API. The The user is supposed to fit the object of interst in template of FrameLayout(2). After the image is captured, I want to crop that image such that only the object of interest that was fitted in template is available. The original image is overwritten by this cropped image.

要裁剪图像,我使用 Bitmap.createBitmap(位图,INT,INT,INT,INT)。对于四 INT 参数,我使用 getLocationInWindow(INT [])的getWidth( )的getHeight()。在code是:

To crop image, I am using Bitmap.createBitmap(bitmap,int,int,int,int). For the four int parameters, I am using getLocationInWindow(int[]) and getWidth() and getHeight(). The code is:

private class SaveImageTask extends AsyncTask<byte[], Void, Void> {

     //Child frame-layout-
        final FrameLayout F1=(FrameLayout) findViewById(R.id.F1);

     //Parent frame-layout-
        final FrameLayout F=(FrameLayout) findViewById(R.id.layout);

        int a[]=new int[2];


        @Override
        protected Void doInBackground(byte[]... data) {
            FileOutputStream outStream = null;

            // Write to SD Card
            try
            {

                Bitmap bitmap;
                bitmap = BitmapFactory.decodeFile(filename_with_path);
                Bitmap newBitmap;

                if (bitmap != null) {

                 // child frame-layoout
                    F1.getLocationOnScreen(a);

                    newBitmap = Bitmap.createBitmap(bitmap,a[0], a[1],F1.getWidth(),F1.getHeight());

                    ByteArrayOutputStream bytes = new ByteArrayOutputStream();
                    newBitmap.compress(Bitmap.CompressFormat.JPEG, 40, bytes);


                    // overwrite original image
                    FileOutputStream fo = new FileOutputStream(filename_with_path);
                    fo.write(bytes.toByteArray());
                    fo.close();

                    bitmap.recycle();
                }
                refreshGallery(outFile);
            }
            catch (Exception e) { e.printStackTrace();}

            return null;
        }
    }

但是,在执行此code,我没有得到期望的裁剪后的图像。相反,越来越关注的对象,裁剪后的图像包含原始图像的不同部分。

But after executing this code I am not getting desired cropped image. Instead of getting object of interest, the cropped image contains different portion of original image.

是) Bitmap.createBitmap的INT参数(单位和int []由返回getLocationOnScreen()不同?

Are the units of int parameters of Bitmap.createBitmap() and int[] returned bygetLocationOnScreen() different?

我们是否需要任何转换?

Do we need any conversion?

感谢您!

推荐答案

确定这里是画布作物类

package com.domp.me;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.ScaleGestureDetector;
import android.view.View;

public class TouchView extends View {

    //private final String TAG = "TESTTESTTESTESTTESTESTEST";

    private Drawable mLeftTopIcon;
    private Drawable mRightTopIcon;
    private Drawable mLeftBottomIcon;
    private Drawable mRightBottomIcon;

    private boolean mLeftTopBool = false;
    private boolean mRightTopBool = false;
    private boolean mLeftBottomBool = false;
    private boolean mRightBottomBool = false;

    // Starting positions of the bounding box

    private float mLeftTopPosX = 30;
    private float mLeftTopPosY = 120;

    private float mRightTopPosX = 150;
    private float mRightTopPosY = 120;

    private float mLeftBottomPosX = 30;
    private float mLeftBottomPosY = 200;

    private float mRightBottomPosX = 150;
    private float mRightBottomPosY = 200;
    private float mPosX;
    private float mPosY;

    private float mLastTouchX;
    private float mLastTouchY;

    private Paint topLine;
    private Paint bottomLine;
    private Paint leftLine;
    private Paint rightLine;

    private Rect buttonRec;

    private int mCenter;

    private static final int INVALID_POINTER_ID = -1;
    private int mActivePointerId = INVALID_POINTER_ID;

    // you can ignore this 
    private ScaleGestureDetector mScaleDetector;
    private float mScaleFactor = 1.f;


    public TouchView(Context context){
        super(context);
        init(context);
    }

    public TouchView(Context context, AttributeSet attrs){
        super (context,attrs);
        init(context);
    }

    public TouchView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init(context);
    }

    private void init(Context context) {

        // I need to create lines for the bouding box to connect

        topLine = new Paint();
        bottomLine = new Paint();
        leftLine = new Paint();
        rightLine = new Paint();

        setLineParameters(Color.WHITE,2);

        // Here I grab the image that will work as the corners of the bounding
        // box and set their positions.

        mLeftTopIcon = context.getResources().getDrawable(R.drawable.corners);

        mCenter = mLeftTopIcon.getMinimumHeight()/2;
        mLeftTopIcon.setBounds((int)mLeftTopPosX, (int)mLeftTopPosY,
                mLeftTopIcon.getIntrinsicWidth()+(int)mLeftTopPosX,
                mLeftTopIcon.getIntrinsicHeight()+(int)mLeftTopPosY);

        mRightTopIcon = context.getResources().getDrawable(R.drawable.corners);
        mRightTopIcon.setBounds((int)mRightTopPosX, (int)mRightTopPosY,
                mRightTopIcon.getIntrinsicWidth()+(int)mRightTopPosX,
                mRightTopIcon.getIntrinsicHeight()+(int)mRightTopPosY);

        mLeftBottomIcon = context.getResources().getDrawable(R.drawable.corners);
        mLeftBottomIcon.setBounds((int)mLeftBottomPosX, (int)mLeftBottomPosY,
                mLeftBottomIcon.getIntrinsicWidth()+(int)mLeftBottomPosX,
                mLeftBottomIcon.getIntrinsicHeight()+(int)mLeftBottomPosY);

        mRightBottomIcon = context.getResources().getDrawable(R.drawable.corners);
        mRightBottomIcon.setBounds((int)mRightBottomPosX, (int)mRightBottomPosY,
                mRightBottomIcon.getIntrinsicWidth()+(int)mRightBottomPosX,
                mRightBottomIcon.getIntrinsicHeight()+(int)mRightBottomPosY);
        // Create our ScaleGestureDetector
        mScaleDetector = new ScaleGestureDetector(context, new ScaleListener());

    }

    private void setLineParameters(int color, float width){

        topLine.setColor(color);
        topLine.setStrokeWidth(width);

        bottomLine.setColor(color);
        bottomLine.setStrokeWidth(width);

        leftLine.setColor(color);
        leftLine.setStrokeWidth(width);

        rightLine.setColor(color);
        rightLine.setStrokeWidth(width);

    }

    // Draws the bounding box on the canvas. Every time invalidate() is called
    // this onDraw method is called.
    public void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        canvas.save();

        canvas.drawLine(mLeftTopPosX+mCenter, mLeftTopPosY+mCenter,
                mRightTopPosX+mCenter, mRightTopPosY+mCenter, topLine);
        canvas.drawLine(mLeftBottomPosX+mCenter, mLeftBottomPosY+mCenter,
                mRightBottomPosX+mCenter, mRightBottomPosY+mCenter, bottomLine);
        canvas.drawLine(mLeftTopPosX+mCenter,mLeftTopPosY+mCenter,
                mLeftBottomPosX+mCenter,mLeftBottomPosY+mCenter,leftLine);
        canvas.drawLine(mRightTopPosX+mCenter,mRightTopPosY+mCenter,
                mRightBottomPosX+mCenter,mRightBottomPosY+mCenter,rightLine);


        mLeftTopIcon.setBounds((int)mLeftTopPosX, (int)mLeftTopPosY,
                mLeftTopIcon.getIntrinsicWidth()+(int)mLeftTopPosX,
                mLeftTopIcon.getIntrinsicHeight()+(int)mLeftTopPosY);

        mRightTopIcon.setBounds((int)mRightTopPosX, (int)mRightTopPosY,
                mRightTopIcon.getIntrinsicWidth()+(int)mRightTopPosX,
                mRightTopIcon.getIntrinsicHeight()+(int)mRightTopPosY);

        mLeftBottomIcon.setBounds((int)mLeftBottomPosX, (int)mLeftBottomPosY,
                mLeftBottomIcon.getIntrinsicWidth()+(int)mLeftBottomPosX,
                mLeftBottomIcon.getIntrinsicHeight()+(int)mLeftBottomPosY);

        mRightBottomIcon.setBounds((int)mRightBottomPosX, (int)mRightBottomPosY,
                mRightBottomIcon.getIntrinsicWidth()+(int)mRightBottomPosX,
                mRightBottomIcon.getIntrinsicHeight()+(int)mRightBottomPosY);


        mLeftTopIcon.draw(canvas);
        mRightTopIcon.draw(canvas);
        mLeftBottomIcon.draw(canvas);
        mRightBottomIcon.draw(canvas);
        canvas.restore();
    }


    public boolean onTouchEvent(MotionEvent ev) {
        final int action = ev.getAction();
        boolean intercept = true;

        switch (action) {

        case MotionEvent.ACTION_DOWN: {

            final float x = ev.getX();
            final float y = ev.getY();

            // in CameraPreview we have Rect rec. This is passed here to return
            // a false when the camera button is pressed so that this view ignores
            // the touch event.
            if ((x >= buttonRec.left) && (x <=buttonRec.right) && (y>=buttonRec.top) && (y<=buttonRec.bottom)){
                intercept = false;
                break;
            }

            // is explained below, when we get to this method.
            manhattanDistance(x,y);

            // Remember where we started
            mLastTouchX = x;
            mLastTouchY = y;
            mActivePointerId = ev.getPointerId(0);
            break;
        }

        case MotionEvent.ACTION_MOVE: {

            final int pointerIndex = ev.findPointerIndex(mActivePointerId);
            final float x = ev.getX();
            final float y = ev.getY();
            //Log.i(TAG,"x: "+x);
            //Log.i(TAG,"y: "+y);

            // Only move if the ScaleGestureDetector isn't processing a gesture.
            // but we ignore here because we are not using ScaleGestureDetector.
            if (!mScaleDetector.isInProgress()) {
                final float dx = x - mLastTouchX;
                final float dy = y - mLastTouchY;

                mPosX += dx;
                mPosY += dy;

                invalidate();
            }

            // Calculate the distance moved
            final float dx = x - mLastTouchX;
            final float dy = y - mLastTouchY;


            // Move the object
            if (mPosX >= 0 && mPosX <=800){
                mPosX += dx;
            }
            if (mPosY >=0 && mPosY <= 480){
                mPosY += dy;
            }

            // while its being pressed n it does not overlap the bottom line or right line
            if (mLeftTopBool && ((y+mCenter*2) < mLeftBottomPosY) && ((x+mCenter*2) < mRightTopPosX)){
                if (dy != 0){
                    mRightTopPosY = y;
                }
                if (dx != 0){
                    mLeftBottomPosX = x;
                }
                mLeftTopPosX = x;//mPosX;
                mLeftTopPosY = y;//mPosY;
            }
            if (mRightTopBool && ((y+mCenter*2) < mRightBottomPosY) && (x > (mLeftTopPosX+mCenter*2))){
                if (dy != 0){
                    mLeftTopPosY = y;
                }
                if (dx != 0){
                    mRightBottomPosX = x;
                }
                mRightTopPosX = x;//mPosX;
                mRightTopPosY = y;//mPosY;
            }
            if (mLeftBottomBool && (y > (mLeftTopPosY+mCenter*2)) && ((x +mCenter*2) < mRightBottomPosX)){
                if (dx != 0){
                    mLeftTopPosX = x;
                }
                if (dy != 0){
                    mRightBottomPosY = y;
                }
                mLeftBottomPosX = x;
                mLeftBottomPosY = y;
            }
            if (mRightBottomBool && (y > (mLeftTopPosY+mCenter*2)) && (x > (mLeftBottomPosX+mCenter*2) )){
                if (dx != 0){
                    mRightTopPosX = x;
                }
                if (dy != 0){
                    mLeftBottomPosY = y;
                }
                mRightBottomPosX = x;
                mRightBottomPosY = y;
            }

            // Remember this touch position for the next move event
            mLastTouchX = x;
            mLastTouchY = y;

            // Invalidate to request a redraw
            invalidate();
            break;
        }
        case MotionEvent.ACTION_UP: {
            // when one of these is true, that means it can move when onDraw is called
            mLeftTopBool = false;
            mRightTopBool = false;
            mLeftBottomBool = false;
            mRightBottomBool = false;
            //mActivePointerId = INVALID_POINTER_ID;
            break;
        }

        case MotionEvent.ACTION_CANCEL: {
            mActivePointerId = INVALID_POINTER_ID;
            break;
        }

        case MotionEvent.ACTION_POINTER_UP: {
            // Extract the index of the pointer that left the touch sensor
            final int pointerIndex = (action & MotionEvent.ACTION_POINTER_INDEX_MASK) 
            >> MotionEvent.ACTION_POINTER_INDEX_SHIFT;
            final int pointerId = ev.getPointerId(pointerIndex);
            if (pointerId == mActivePointerId) {
                // This was our active pointer going up. Choose a new
                // active pointer and adjust accordingly.
                final int newPointerIndex = pointerIndex == 0 ? 1 : 0;
                mLastTouchX = ev.getX(newPointerIndex);
                mLastTouchY = ev.getY(newPointerIndex);
                mActivePointerId = ev.getPointerId(newPointerIndex);
            }
            break;
        }
        }
        return intercept;
    }

    // Where the screen is pressed, calculate the distance closest to one of the 4 corners
    // so that it can get the pressed and moved. Only 1 at a time can be moved.
    private void manhattanDistance(float x, float y) {

        double leftTopMan = Math.sqrt(Math.pow((Math.abs((double)x-(double)mLeftTopPosX)),2)
                + Math.pow((Math.abs((double)y-(double)mLeftTopPosY)),2));

        double rightTopMan = Math.sqrt(Math.pow((Math.abs((double)x-(double)mRightTopPosX)),2)
                + Math.pow((Math.abs((double)y-(double)mRightTopPosY)),2));

        double leftBottomMan = Math.sqrt(Math.pow((Math.abs((double)x-(double)mLeftBottomPosX)),2)
                + Math.pow((Math.abs((double)y-(double)mLeftBottomPosY)),2));

        double rightBottomMan = Math.sqrt(Math.pow((Math.abs((double)x-(double)mRightBottomPosX)),2)
                + Math.pow((Math.abs((double)y-(double)mRightBottomPosY)),2));

        //Log.i(TAG,"leftTopMan: "+leftTopMan);
        //Log.i(TAG,"RightTopMan: "+rightTopMan);

        if (leftTopMan < 50){
            mLeftTopBool = true;
            mRightTopBool = false;
            mLeftBottomBool = false;
            mRightBottomBool = false;
        }
        else if (rightTopMan < 50){
            mLeftTopBool = false;
            mRightTopBool = true;
            mLeftBottomBool = false;
            mRightBottomBool = false;
        }
        else if (leftBottomMan < 50){
            mLeftTopBool = false;
            mRightTopBool = false;
            mLeftBottomBool = true;
            mRightBottomBool = false;
        }
        else if (rightBottomMan < 50){
            mLeftTopBool = false;
            mRightTopBool = false;
            mLeftBottomBool = false;
            mRightBottomBool = true;
        }

    }
    private class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener {
        @Override
        public boolean onScale(ScaleGestureDetector detector) {
            mScaleFactor *= detector.getScaleFactor();

            // Don't let the object get too small or too large.
            mScaleFactor = Math.max(0.1f, Math.min(mScaleFactor, 5.0f));

            invalidate();
            return true;
        }
    }

    public float getmLeftTopPosX(){
        return mLeftTopPosX;
    }
    public float getmLeftTopPosY(){
        return mLeftTopPosY;
    }
    public float getmRightTopPosX(){
        return mRightTopPosX;
    }
    public float getmRightTopPosY(){
        return mRightTopPosY;
    }
    public float getmLeftBottomPosX() {
        return mLeftBottomPosX;
    }
    public float getmLeftBottomPosY() {
        return mLeftBottomPosY;
    }
    public float getmRightBottomPosY() {
        return mRightBottomPosY;
    }
    public float getmRightBottomPosX() {
        return mRightBottomPosX;
    }
    public void setRec(Rect rec) {
        this.buttonRec = rec;
    }

    // calls the onDraw method, I used it in my app Translanguage OCR
    // because I have a thread that needs to invalidate, or redraw
    // you cannot call onDraw from a thread not the UI thread.
    public void setInvalidate() {
        invalidate();

    }
}

和本code你捕捉的矩形区域

and by this code you capture the rectangular area

package com.domp.me;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;



import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.ObjectAnimator;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.graphics.Bitmap;
import android.graphics.Rect;
import android.graphics.Bitmap.CompressFormat;
import android.graphics.drawable.Drawable;
import android.hardware.Camera;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.hardware.Camera.AutoFocusCallback;
import android.hardware.Camera.Size;
import android.os.Bundle;
import android.os.Environment;
import android.os.Looper;
import android.text.Layout;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.Display;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.Surface;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.view.View.OnClickListener;
import android.view.animation.AccelerateInterpolator;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.view.animation.DecelerateInterpolator;
import android.view.animation.Interpolator;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.Toast;
import android.widget.RelativeLayout.LayoutParams;


public class CameraPreview extends Activity implements SensorEventListener {

    private Preview mPreview; 
    private ImageView mTakePicture;
    private TouchView mView;
    Display mDisplay;
    DisplayMetrics mDisplayMetrics;
 AlertDialogManager alert = new AlertDialogManager();
    private boolean mAutoFocus = true;
    ImageButton hidingcrop;
    ImageButton showgrid;
    ImageButton hidegrid;
       private Animation animShow, animHide;
    com.domp.me.GridCrop grid;
    private boolean mFlashBoolean = false;
   private RelativeLayout relative;
    private SensorManager mSensorManager;
    private Sensor mAccel;
    private boolean mInitialized = false;
    private float mLastX = 0;
    private float mLastY = 0;

    private float mLastZ = 0;
    private Rect rec = new Rect();
Camera mCamera;
    private int mScreenHeight;
    private int mScreenWidth;
    Toast t;
    private boolean mInvalidate = false;
    Animation ranim_clockwise, ranim_anticlockwise;
    private File mLocation = new File(Environment.
            getExternalStorageDirectory(),"DompitCrop.jpg");

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);
        setContentView(R.layout.activity_crop);
        t.makeText(CameraPreview.this, "When Capturing Wait 4 Seconds", Toast.LENGTH_LONG).show();
        t.makeText(CameraPreview.this, "Whe", Toast.LENGTH_SHORT).setGravity(mScreenWidth, mScreenWidth, mScreenHeight);
        if(t.makeText(CameraPreview.this, "Whe", Toast.LENGTH_LONG).getView().isShown()){
            t.makeText(CameraPreview.this, "Whe", Toast.LENGTH_LONG).cancel();
        }
        animShow = AnimationUtils.loadAnimation( this, R.anim.popup_show);
        animHide = AnimationUtils.loadAnimation( this, R.anim.wave_scale);
        relative = (RelativeLayout)findViewById(R.id.mainlayout);
        relative.startAnimation(animHide);
        mTakePicture = (ImageView) findViewById(R.id.capture);
        ranim_clockwise = AnimationUtils.loadAnimation(this,R.anim.rotate_clockwise);
        ranim_anticlockwise = AnimationUtils.loadAnimation(this,R.anim.rorate_anticlockwise);


        // the accelerometer is used for autofocus
        mSensorManager = (SensorManager) getSystemService(Context.
                SENSOR_SERVICE);
        mAccel = mSensorManager.getDefaultSensor(Sensor.
                TYPE_ACCELEROMETER);

        // get the window width and height to display buttons
        // according to device screen size
        DisplayMetrics displaymetrics = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
        mScreenHeight = displaymetrics.heightPixels;
        mScreenWidth = displaymetrics.widthPixels;
        // I need to get the dimensions of this drawable to set margins
        // for the ImageView that is used to take pictures
        Drawable mButtonDrawable = this.getResources().
        getDrawable(R.drawable.cam);



        // setting where I will draw the ImageView for taking pictures

        // rec is used for onInterceptTouchEvent. I pass this from the
        // highest to lowest layer so that when this area of the screen
        // is pressed, it ignores the TouchView events and passes it to
        // this activity so that the button can be pressed.
        rec.set((int)((double)mScreenWidth*.85),
                (int)((double)mScreenHeight*.10) ,
                (int)((double)mScreenWidth*.85)+mButtonDrawable.getMinimumWidth(), 
                (int)((double)mScreenHeight*.70)+mButtonDrawable.getMinimumHeight());
        mButtonDrawable = null;
        mTakePicture.setOnClickListener(previewListener);
        grid = (com.domp.me.GridCrop)findViewById(R.id.grid);
        Button btn = (Button)findViewById(R.id.button1);

        hidingcrop = (ImageButton) findViewById(R.id.imagecrope);
        hidingcrop.setOnClickListener(mylistener);
        btn.setOnClickListener(flashListener);
        // get our Views from the XML layout
        mPreview = (Preview) findViewById(R.id.preview);
        mView = (TouchView) findViewById(R.id.left_top_view);
        mView.setRec(rec);

    }

    // this is the autofocus call back
    private AutoFocusCallback myAutoFocusCallback = new AutoFocusCallback(){

        public void onAutoFocus(boolean autoFocusSuccess, Camera arg1) {
            //Wait.oneSec();
            mAutoFocus = true;
        }};

        // with this I get the ratio between screen size and pixels
        // of the image so I can capture only the rectangular area of the
        // image and save it.
        public Double[] getRatio(){
            Size s = mPreview.getCameraParameters().getPreviewSize();
            double heightRatio = (double)s.height/(double)mScreenHeight;
            double widthRatio = (double)s.width/(double)mScreenWidth;
            Double[] ratio = {heightRatio,widthRatio};
            return ratio;
        }
        public void release(){
            mCamera.release();
            }
            private OnClickListener mylistener = new OnClickListener(){

                @Override
                public void onClick(View arg0) {

                        Camera camera = null;
                        try {
                            camera = Camera.open();
                        } catch (RuntimeException e) {

                        } finally {
                            if (camera != null) camera.release();
                            Intent i = new Intent(CameraPreview.this, BackScreenTry.class);
                            startActivity(i);
                            finish();
                        }


                }

                }

            ;
        // I am not using this in this example, but its there if you want
        // to turn on and off the flash.

        private OnClickListener flashListener = new OnClickListener(){

            @Override
            public void onClick(View v) {

                    mPreview.setFlash(true);

                mFlashBoolean = !mFlashBoolean;
            }

        };


        // This method takes the preview image, grabs the rectangular
        // part of the image selected by the bounding box and saves it.
        // A thread is needed to save the picture so not to hold the UI thread.
        private OnClickListener previewListener = new OnClickListener() {

            @Override
            public void onClick(View v) {
                    mPreview.setCameraFocus(myAutoFocusCallback);

                    Thread tGetPic = new Thread( new Runnable() {

                        public void run() {
                            Double[] ratio = getRatio();
                            int left = (int) (ratio[1]*(double)mView.getmLeftTopPosX());
                            // 0 is height
                            int top = (int) (ratio[0]*(double)mView.getmLeftTopPosY());

                            int right = (int)(ratio[1]*(double)mView.getmRightBottomPosX());

                            int bottom = (int)(ratio[0]*(double)mView.getmRightBottomPosY());

                            savePhoto(mPreview.getPic(left,top,right,bottom));
                            mAutoFocus = true;




                        } 
                    });
                    tGetPic.start();
                    Wait.oneSec();
                    Intent i = new Intent(CameraPreview.this, AnimationScreenForCrop.class);
                    startActivity(i);
                    finish();
                    }

                }

        ;



        public boolean savePhoto(Bitmap bm) {
            System.gc();
            FileOutputStream image = null;
            try {
                image = new FileOutputStream(mLocation);
            } catch (FileNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            bm.compress(CompressFormat.JPEG, 100, image);

            int h = bm.getHeight();
            int w = bm.getWidth();


            return false;

        }

        public boolean onInterceptTouchEvent(MotionEvent ev) {
            final int action = ev.getAction();
            boolean intercept = false;
            switch (action) {
            case MotionEvent.ACTION_UP:
                break;
            case MotionEvent.ACTION_DOWN:
                float x = ev.getX();
                float y = ev.getY();
                // here we intercept the button press and give it to this 
                // activity so the button press can happen and we can take 
                // a picture.
                if ((x >= rec.left) && (x <= rec.right) && (y>=rec.top) && (y<=rec.bottom)){
                    intercept = true;
                }
                break;
            }
            return intercept;
        }

        // mainly used for autofocus to happen when the user takes a picture
        // I also use it to redraw the canvas using the invalidate() method
        // when I need to redraw things.
        public void onSensorChanged(SensorEvent event) {



            if (mInvalidate == true){
                mView.invalidate();
                mInvalidate = false;
            }
            float x = event.values[0];
            float y = event.values[1];
            float z = event.values[2];
            if (!mInitialized){
                mLastX = x;
                mLastY = y;
                mLastZ = z;
                mInitialized = true;
            }
            float deltaX  = Math.abs(mLastX - x);
            float deltaY = Math.abs(mLastY - y);
            float deltaZ = Math.abs(mLastZ - z);

            if (deltaX > .5 && mAutoFocus){ //AUTOFOCUS (while it is not autofocusing)
                mAutoFocus = false;
                mPreview.setCameraFocus(myAutoFocusCallback);
            }
            if (deltaY > .5 && mAutoFocus){ //AUTOFOCUS (while it is not autofocusing)
                mAutoFocus = false;
                mPreview.setCameraFocus(myAutoFocusCallback);
            }

            if (deltaZ > .5 && mAutoFocus){ //AUTOFOCUS (while it is not autofocusing) */
                mAutoFocus = false;
                mPreview.setCameraFocus(myAutoFocusCallback);
            }

            mLastX = x;
            mLastY = y;
            mLastZ = z;

        }


        // extra overrides to better understand app lifecycle and assist debugging
        @Override
        protected void onDestroy() {
            super.onDestroy();
            //Log.i(TAG, "onDestroy()");
        }

        @Override
        protected void onPause() {
            super.onPause();
            //Log.i(TAG, "onPause()");
            mSensorManager.unregisterListener(this);
        }

        @Override
        protected void onResume() {
            super.onResume();
            mSensorManager.registerListener(this, mAccel, SensorManager.SENSOR_DELAY_UI);
            //Log.i(TAG, "onResume()");
        }

        @Override
        protected void onRestart() {
            super.onRestart();
            //Log.i(TAG, "onRestart()");
        }

        @Override
        protected void onStop() {
            super.onStop();
            //Log.i(TAG, "onStop()");
        }

        @Override
        protected void onStart() {
            super.onStart();
            //Log.i(TAG, "onStart()");
        }
        @Override
        public void onAccuracyChanged(Sensor arg0, int arg1) {

}
}

享受:)

这篇关于如何裁剪图像与模板的坐标的帮助的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆