I'm going to compress image with Bitmap.compress()
method.
But when I get Bitmap
using bitmap = BitmapFactory.decodeFile()
I get a null
object, and the method didn't thow any exception.
Here's my code
public static File compressImage(String imagePath) throws IOException {
// Get bitmap
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
Bitmap bitmap = BitmapFactory.decodeFile(imagePath, options);
// Get bitmap output stream
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, byteArrayOutputStream);
......
When the code runs at the last line I get a NullPointerException
:
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
Then I run my code in debug mode, it turns out I got a null
object from BitmapFactory.decodeFile
method.
The parameter imagePath
is
/storage/emulated/0/DCIM/Camera/IMG_20160610_195633.jpg
which seems ok.
This piece of code works well in another activity, but when i copy it to a async thread which I attempt to compress and upload images, it crashed. Is there any possibilities that this is because the async thread thing? Or something else I didn't notice?
Remove the following from your code:
options.inJustDecodeBounds = true;
From the documentation of inJustDecodeBounds
:
If set to true, the decoder will return null (no bitmap), but the out... fields will still be set, allowing the caller to query the bitmap without having to allocate the memory for its pixels.
inJustDecodeBounds
is useful to load large Bitmap
s efficiently, since you can read their dimensions without having to allocate the memory for them, although it has no purpose in your code.