Android 通过相机使用动态坐标捕捉图像

Android 通过相机使用动态坐标捕捉图像,android,dynamic,view,android-camera,android-canvas,Android,Dynamic,View,Android Camera,Android Canvas,我正在制作一个基于相机的应用程序,我把一个矩形视图放在相机上。 当我使用new Camera.PictureCallback()拍摄图像时,我裁剪了该图像,以获得矩形的一部分。 嗯,它很好用 现在我实现了View.OnTouchListener,并使用它使形状可移动 因此,我需要捕捉用户最终选择的图像,比如他们放置矩形的位置 这是我用来裁剪图像的方法。这些值被硬记录下来以找到准确的位置。 现在我需要改变矩形的顶部、底部、高度和宽度的值 //用于绘制矩形的自定义视图 public class Cu

我正在制作一个基于相机的应用程序,我把一个矩形视图放在相机上。 当我使用
new Camera.PictureCallback()
拍摄图像时,我裁剪了该图像,以获得矩形的一部分。 嗯,它很好用

现在我实现了
View.OnTouchListener
,并使用它使形状可移动

因此,我需要捕捉用户最终选择的图像,比如他们放置矩形的位置

这是我用来裁剪图像的方法。这些值被硬记录下来以找到准确的位置。 现在我需要改变矩形的顶部、底部、高度和宽度的值

//用于绘制矩形的自定义视图

public class CustomView extends View  {
    private Paint paint = new Paint();
    public CustomView(Context context) {
        super(context);
    }

    @Override
    protected void onDraw(Canvas canvas) { // Override the onDraw() Method
        super.onDraw(canvas);

        paint.setStyle(Paint.Style.STROKE);
        paint.setColor(Color.GREEN);
        paint.setStrokeWidth(10);

        //center
        int x0 = canvas.getWidth()/2;
        int y0 = canvas.getHeight()/2;
        int dx = canvas.getHeight()/3;
        int dy = canvas.getHeight()/3;
        //draw guide box
        canvas.drawRect(x0-dx, y0-dy, x0+dx, y0+dy, paint);
    }


}
//我的图片回调代码

  Camera.PictureCallback mPicture = new Camera.PictureCallback() {

        public void onPictureTaken(byte[] data, Camera camera) {

            // Replacing the button after a photho was taken.


            // File name of the image that we just took.
            fileName = "IMG_" + new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()).toString() + ".jpg";

            // Creating the directory where to save the image. Sadly in older
            // version of Android we can not get the Media catalog name
            File mkDir = new File(sdRoot, dir);
            mkDir.mkdirs();

            // Main file where to save the data that we recive from the camera
            File pictureFile = new File(sdRoot, dir + fileName);

            // Cropping image with the corresponding co-ordinates and save in to a file
            try {

                Bitmap imageOriginal = BitmapFactory.decodeByteArray(data, 0, data.length); // 2560×1440
                float scale = 1280 / 1000;
                int left = (int) (scale * (imageOriginal.getWidth() - 250) / 2);
                int top = (int) (scale * (imageOriginal.getHeight() - 616) / 2);
                int width = (int) (scale * 750);
                int height = (int) (scale * 616);
                Bitmap imageConverted = Bitmap.createBitmap(imageOriginal, left, top, width, height, null, false);

                FileOutputStream purge = new FileOutputStream(pictureFile);
                imageConverted.compress(Bitmap.CompressFormat.JPEG, 100, purge);
                purge.flush();
                purge.close();

            } catch (FileNotFoundException e) {
                Log.d("DG_DEBUG", "File not found: " + e.getMessage());
            } catch (IOException e) {
                Log.d("DG_DEBUG", "Error accessing file: " + e.getMessage());
            }

            // Adding Exif data for the orientation.
            try {
                ProjectManager.getInstance().settings.IMAGE_LOCATION = "/sdcard/" + dir + fileName;
                exif = new ExifInterface(ProjectManager.getInstance().settings.IMAGE_LOCATION);
                exif.setAttribute(ExifInterface.TAG_ORIENTATION, "" + orientation);
                exif.saveAttributes();
                mView.saveImage(dir + fileName);
            } catch (IOException e) {
                e.printStackTrace();
            }

        }
    };

你的矩形是mCustomView.getWidth()*2/3像素宽,mCustomView.getHeight()*2/3像素高,如果我理解正确的话,它的左角是mCustomView.getWidth()的1/6

public void onPictureTaken(byte[] data, Camera camera) {
    //.../
    Bitmap imageOriginal = BitmapFactory.decodeByteArray(data, 0, data.length);
    int[] customViewPosition;
    mCustomView.getLocationInWindow(customViewPosition);
    int[] surfacePosition;
    mSurfaceView.getLocationInWindow(surfacePosition);

    float scale = imageOriginal.getWidth()/(float)mSurfaceView.getWidth();
    int left = (int) scale*(customViewPosition[0] + mCustomView.getWidth()/6F - surfacePosition[0]);
    int top = (int) scale*(customViewPosition[1] + mCustomView.getHeight()/6F - surfacePosition[1]);
    int width = (int) scale*mCustomView.getWidth()*2/3;
    int height = (int) scale*mCustomView.getHeight()*2/3;
    Bitmap imageCropped = Bitmap.createBitmap(imageOriginal, left, top, width, height, null, false);
    //.../
}

对我来说,我先拍摄一张图像,然后根据图像所选区域的尺寸进行裁剪

public void onPictureTaken(byte[] data, Camera camera) {


                Bitmap imageOriginal = BitmapFactory.decodeByteArray(data, 0, data.length, null);
                int width = imageOriginal.getWidth();
                int height = imageOriginal.getHeight(); // for width
                int narrowSize = Math.min(width, height); // for height
                int differ = (int) Math.abs((imageOriginal.getHeight() - imageOriginal.getWidth()) / 2.0f);  // for dimension
                width = (width == narrowSize) ? 0 : differ;
                height = (width == 0) ? differ : 0; 

                Matrix rotationMatrix = new Matrix();
                rotationMatrix.postRotate(90); // for orientation

                Bitmap imageCropped = Bitmap.createBitmap(imageOriginal, width, height, narrowSize, narrowSize, rotationMatrix, false);


    }


任何用户放置绿色矩形的地方,我只需要捕获或保存该部分。绿色矩形位于相机视图上方。那个背景是一个正在运行的摄像头。没有回复??为什么?嗨,瓦伦·钱德兰。。到目前为止,你找到了解决方法吗?@VibhorBhardwaj下面的答案给出了类似的输出,但对我的问题来说并不完美。嗨,我尝试过这个,但customViewPosition、surfacePosition始终给出0,0??我有疑问吗?surfaceview将始终保持不变,对吗?只有customview会更改?customViewPosition和surfacePosition可以是(0,0)。但这取决于你的布局。mCustomView也很可能保持不变。如果我必须经常使用它们,我会将上面的所有值保存在预缓存中。但是,当我们每个捕获的图像只需要它们一次时,开销可以忽略不计。不可能,customViewPosition和surfacePosition始终为0,0。我试了很多次,但是没有改变值。如果它们为0,0,则应用程序崩溃。左=142,顶=80,宽=568,高=320----位图imageCropped=Bitmap.createBitmap(imageOriginal,左,顶,宽,高,空,假);在此语句上发生崩溃,出现错误--java.lang.IllegalArgumentException:x+宽度必须为
public void onPictureTaken(byte[] data, Camera camera) {


                Bitmap imageOriginal = BitmapFactory.decodeByteArray(data, 0, data.length, null);
                int width = imageOriginal.getWidth();
                int height = imageOriginal.getHeight(); // for width
                int narrowSize = Math.min(width, height); // for height
                int differ = (int) Math.abs((imageOriginal.getHeight() - imageOriginal.getWidth()) / 2.0f);  // for dimension
                width = (width == narrowSize) ? 0 : differ;
                height = (width == 0) ? differ : 0; 

                Matrix rotationMatrix = new Matrix();
                rotationMatrix.postRotate(90); // for orientation

                Bitmap imageCropped = Bitmap.createBitmap(imageOriginal, width, height, narrowSize, narrowSize, rotationMatrix, false);


    }