Android Camera - How can i take a specific “rectangle” from the byte array?

跟風遠走 提交于 2019-11-29 08:42:56

问题


I have created an application that shoots and saves photos. I have a preview and an overlay on top of that preview. The overlay defines a square (the area around the square shows the preview a bit darker), as you can see in the image:

example

What i need to do is to extract the part of the image where the square is. The square is defined like this:

    Rect frame = new Rect(350,50,450,150);

How can i do that? i have the byte array (byte[] data) that i can save, but i want to change the application so that only the square area will be saved.

Edit: i have tried the following:

int[] pixels = new int[100000];
            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            Bitmap bitmap = BitmapFactory.decodeByteArray(data , 0, data.length);
            bitmap.getPixels(pixels, 0, 480, 350, 50, 100, 100);
            bitmap = Bitmap.createBitmap(pixels, 0, 100, 100, 100, Config.ARGB_4444);
            bitmap.compress(CompressFormat.JPEG, 0, bos);
            byte[] square = bos.toByteArray();

and then write the array "square" to a new file... The problem is that i get a picture made of lines... there is a problem with the transformation that i made


回答1:


It took me some time to figure out that the code should look like this:

int[] pixels = new int[100*100];//the size of the array is the dimensions of the sub-photo
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        Bitmap bitmap = BitmapFactory.decodeByteArray(data , 0, data.length);
        bitmap.getPixels(pixels, 0, 100, 350, 50, 100, 100);//the stride value is (in my case) the width value
        bitmap = Bitmap.createBitmap(pixels, 0, 100, 100, 100, Config.ARGB_8888);//ARGB_8888 is a good quality configuration
        bitmap.compress(CompressFormat.JPEG, 100, bos);//100 is the best quality possibe
        byte[] square = bos.toByteArray();



回答2:


The camera preview data comes in YUV format (specifically ImageFormat.NV21), which BitmapFactory doesn't support directly. You can use YuvImage to convert it to a Bitmap as described here. The only difference is that you'll want to pass a Rect corresponding to the square that you want when calling YuvImage.compressToJpeg.



来源:https://stackoverflow.com/questions/9656350/android-camera-how-can-i-take-a-specific-rectangle-from-the-byte-array

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!