1

I have an app where the user can create an event and upload an image from their gallery and upload it to FirebaseStorage. Everything is working fine but the images are really big in size and i'd like to optimize the loading/downloading process. I've already tried with this :

// Get the data from an ImageView as bytes
imageView.setDrawingCacheEnabled(true);
imageView.buildDrawingCache();
Bitmap bitmap = imageView.getDrawingCache();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);
byte[] data = baos.toByteArray();

UploadTask uploadTask = mountainsRef.putBytes(data);
uploadTask.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception exception) {
    // Handle unsuccessful uploads
}
}).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
@Override
public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
    // taskSnapshot.getMetadata() contains file metadata such as size,  content-type
    Uri downloadUrl = taskSnapshot.getDownloadUrl();
}
});

and setting bitmap.compress(Bitmap.CompressFormat.JPEG, 50, baos); This works but this basically makes every image ugly. Is there a way, with a guide if possible, to reduce the size of the image without completely destroying the quality ?

Frank van Puffelen
  • 565,676
  • 79
  • 828
  • 807
Davide Valiante
  • 155
  • 2
  • 12

1 Answers1

0

What helped me was i scaled down the image resolution after converting the captured image to 1280 x 720 and then it dropped my file size by more that 50%.

Here is an example method.

   /**
     * Compress the file and return the compressed photo
     *
     * @return photoFile
     */
    public File PhotoCompressor(File PhotoFile) {
        Bitmap b = BitmapFactory.decodeFile(photoFile.getAbsolutePath());


        int originalWidth = b.getWidth();
        int originalHeight = b.getHeight();
        int boundWidth = COMPRESSED_PHOTO_WIDTH;
        int boundHeight = COMPRESSED_PHOTO_HEIGHT;
        int newWidth = originalWidth;
        int newHeight = originalHeight;

        //check if the image needs to be scale width
        if (originalWidth > boundWidth) {
            //scale width to fit
            newWidth = boundWidth;
            //scale height to maintain aspect ratio
            newHeight = (newWidth * originalHeight) / originalWidth;
        }

        //now check if we need to scale even the new height
        if (newHeight > boundHeight) {
            //scale height to fit instead
            newHeight = boundHeight;
            //scale width to maintain aspect ratio
            newWidth = (newHeight * originalWidth) / originalHeight;
        }
        Log.i(TAG, "Original Image:" + originalHeight + " x" + originalWidth);
        Log.i(TAG, "New Image:" + newHeight + " x" + newWidth);
        try {
            Bitmap out = Bitmap.createScaledBitmap(b, newWidth, newHeight, true);
            FileOutputStream fOut;
            fOut = new FileOutputStream(photoFile);
            out.compress(Bitmap.CompressFormat.JPEG, 100, fOut);
            fOut.flush();
            fOut.close();
            b.recycle();
            out.recycle();
        } catch (OutOfMemoryError exception) {
            Log.e(TAG, "OutofMemory excpetion" + exception);
            exception.printStackTrace();
        } catch (FileNotFoundException e) {
            Log.e(TAG, "File not found excpetion" + e);
            e.printStackTrace();
        } catch (IOException e) {
            Log.e(TAG, "IO exception excpetion" + e);
            e.printStackTrace();
        }
        return photoFile;
    }
nishon.tan
  • 969
  • 2
  • 8
  • 21