使用动态坐标通过相机捕获图像 [英] Capture image using dynamic co-ordinates through the camera

查看:112
本文介绍了使用动态坐标通过相机捕获图像的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在制作一个基于相机的应用程序,在该应用程序中,我在相机上放置了一个矩形视图. 当我使用new Camera.PictureCallback()捕获图像时,我对该图像进行了裁剪,以便获得矩形的一部分. 好吧,它的工作正常.

I am making a camera based application, where I put a rectangular view over the camera. When I capture an image using new Camera.PictureCallback(), I cropped that image so as it will get the part of the rectangle. Well, its working fine.

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

Now I implemented View.OnTouchListener and using that I made the shape movable.

因此,我需要使用用户的最终选择来捕获图像,就像他们放置矩形的位置一样.

So, I need to capture the image with the final selection of the user, like where they place the rectangle.

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

这是我用来裁剪图像的方法.这些值很难找到确切的位置. 现在,我需要具有不断变化的矩形的顶部,底部,高度,宽度的值.

This is the method i used to crop image.The values are hard corded to find the exact position. Now i need values for that top ,bottom, height, width with the changing rectangle.

//我用来绘制矩形的customView

//My customView that used to draw that rectangle

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();
            }

        }
    };

推荐答案

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

For me, I take a image then crop according to dimension of the selected area of the image..

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


    }

捕获图像

输出图像

这篇关于使用动态坐标通过相机捕获图像的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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