Search code examples
javaandroidbitmapfileoutputstream

NullPointerException when convert and save Image file on Android device


I'm trying to save a Image type data as a jpg file to SD card, what I plan to do is first converting it to Bitmap, compress bitmap as jpeg format, then use FileOutputStream to save it to SD card.

Here's my code:

File imagefile = new File(sdCardPath, "image.jpg");
Image image = fromFrame.getImage();

ByteBuffer bbuffer = image.getPlanes()[0].getBuffer();
byte[] byts = new byte[bbuffer.capacity()];
bbuffer.get(byts);
Bitmap bitmapImage = BitmapFactory.decodeByteArray(byts, 0, byts.length, null);
try{
    FileOutputStream out = new FileOutputStream(imagefile);
    bitmapImage.compress(Bitmap.CompressFormat.JPEG, 100, out);
    out.flush();
    out.close();
} catch (FileNotFoundException e) {
    Log.v(TAG, "FileNotFoundExceptionError " + e.toString());
} catch (IOException e) {
    Log.v(TAG, "IOExceptionError " + e.toString());
}

It gives error:

java.lang.NullPointerException: Attempt to invoke virtual method 'boolean 
android.graphics.Bitmap.compress(android.graphics.Bitmap$CompressFormat, 
int, java.io.OutputStream)' on a null object reference

Is there anything I missed or did it wrong?


Solution

  • It turns out that the image file has to be re-organized and as for Depth16 file, every pixel has 16 bits of data, so the code to convert it into a jpg file is:

    Image depthimage = fromFrame.getImage();
    int imwidth = depthImage.getWidth();
    int imheight = depthImage.getHeight();
    Image.Plane plane = depthImage.getPlanes()[0];
    ShortBuffer shortDepthBuffer = plane.getBuffer().asShortBuffer();
    File sdCardFile = Environment.getExternalStorageDirectory();
    File file = new File(sdCardFile, "depthImage.jpg");
    Bitmap disBitmap = Bitmap.createBitmap(imwidth, imheight, Bitmap.Config.RGB_565);
        for (int i = 0; i < imheight; i++) {
            for (int j = 0; j < imwidth; j++) {
                int index = (i * imwidth + j) ;
                shortDepthBuffer.position(index);
                short depthSample = shortDepthBuffer.get();
                short depthRange = (short) (depthSample & 0x1FFF);
                byte value = (byte) depthRange ;
                disBitmap.setPixel(j, i, Color.rgb(value, value, value));
       }
    }
                Matrix matrix = new Matrix();
                matrix.setRotate(90);
                Bitmap rotatedBitmap = Bitmap.createBitmap(disBitmap, 0, 0, imwidth, imheight, matrix, true);
                try {
                    FileOutputStream out = new FileOutputStream(file);
                    rotatedBitmap.compress(Bitmap.CompressFormat.JPEG, 90, out);
                    out.flush();
                    out.close();
                    MainActivity.num++;
                    } catch (Exception e) {
                    e.printStackTrace();
                    }
                    } catch (Exception e) {
                    e.printStackTrace();
                    }
    

    I also rotate the picture to make it easier to review on mobile devices