BitmapFactory.decodeByteArray() is returning NULL BitmapFactory.decodeByteArray() is returning NULL android android

BitmapFactory.decodeByteArray() is returning NULL


Alright, hopefully this will help.

Scoured the internet looking for a fast solution, and found the perfect thing.

This works as of Android 2.1

Thanks to off3nsiv3 from this page.

// Convert to JPGSize previewSize = camera.getParameters().getPreviewSize(); YuvImage yuvimage=new YuvImage(data, ImageFormat.NV21, previewSize.width, previewSize.height, null);ByteArrayOutputStream baos = new ByteArrayOutputStream();yuvimage.compressToJpeg(new Rect(0, 0, previewSize.width, previewSize.height), 80, baos);byte[] jdata = baos.toByteArray();// Convert to BitmapBitmap bmp = BitmapFactory.decodeByteArray(jdata, 0, jdata.length);

Just a little modification to off3nsiv3's code and you're set. The FPS is still incredibly high compared to manual decoding.

For the above code, the 80 is the jpeg quality (0 from 100, 100 being best).


you can try this and it is working...

mCamera.setOneShotPreviewCallback(new Camera.PreviewCallback() {                @Override                public void onPreviewFrame(byte[] data, Camera camera) {                    Camera.Parameters parameters = camera.getParameters();                    int format = parameters.getPreviewFormat();                    //YUV formats require more conversion                    if (format == ImageFormat.NV21 || format == ImageFormat.YUY2 || format == ImageFormat.NV16) {                        int w = parameters.getPreviewSize().width;                        int h = parameters.getPreviewSize().height;                        // Get the YuV image                        YuvImage yuv_image = new YuvImage(data, format, w, h, null);                        // Convert YuV to Jpeg                        Rect rect = new Rect(0, 0, w, h);                        ByteArrayOutputStream output_stream = new ByteArrayOutputStream();                        yuv_image.compressToJpeg(rect, 100, output_stream);                        byte[] byt = output_stream.toByteArray();                        FileOutputStream outStream = null;                        try {                            // Write to SD Card                            File file = createFileInSDCard(FOLDER_PATH, "Image_"+System.currentTimeMillis()+".jpg");                            //Uri uriSavedImage = Uri.fromFile(file);                            outStream = new FileOutputStream(file);                            outStream.write(byt);                            outStream.close();                        } catch (FileNotFoundException e) {                            e.printStackTrace();                        } catch (IOException e) {                            e.printStackTrace();                        } finally {                        }                    }                }


I'm trying to do the same thing. Based on the discussions here and here, it sounds like people have not had luck getting decodeByteArray() to handle NV21 format as of Android 2.1/2.2. It definitely doesn't work in my emulator or on my Droid Incredible, although I think this calls native code so it may work on some phones depending on the drivers?

As an alternative, you can try to decode the NV21 yourself in Java (see link above for an example), although this is apparently too slow to be useful for most cases. I haven't had much luck trying to get CameraPreview to send a different format either, and I would expect this to be problematic for trying to write code that is portable across different hardware. If you wrote the NV21 decode methods in NDK you might get the framerate up a bit.

Apparently there are stability problems due to race conditions in trying to process the CameraPreview too, although I haven't confirmed this issue myself. I think you might avoid this and also get your framerate up a bit by using the buffered preview callback method setPreviewCallbackWithBuffer() that was added in Android 2.1/2.2. This was added in 2.1 but was left hidden until 2.2. To use it in 2.1 you need to hack around the hiding.

Some people have suggested using MediaRecorder instead of CameraPreview. Unfortunately, MediaRecorder appears to have even less provided for getting preview frames than CameraPreview, so I can't recommend that route.