Android - compress bitmap before saving it to SDCARD in activity for result

10,889

When you do picture.compress(Bitmap.CompressFormat.PNG, 50, outStream); the compression wont work as PNG which is lossless, will ignore the quality setting. So the parameter 50 wont work in this case. So i suggest you to change CompressFormat.PNG to CompressFormat.JPEG.

Share:
10,889
Splitusa
Author by

Splitusa

Updated on June 04, 2022

Comments

  • Splitusa
    Splitusa almost 2 years

    I've been busting my head on this, and not so sure what to do. What I am trying to do is: Take a picture, compress it to png (keeping the original dimensions), and then save it to sdCard. The reason why I need to do this is because I have to recompress it again, then Base64 encode it so i can send it to a server. The problem is 1. the file is too big 2. i am running out of memory and 3. not sure if I am doing this correctly.

    Thanks for your help

    Here is my code:

    @Override
    public void onClick(View button) {
        switch (button.getId()) {
            case R.id.cameraButton:
                Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                cameraIntent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT,
                    Uri.fromFile(new File("/sdcard/test.png")));
                startActivityForResult(cameraIntent, CAMERA_PIC_REQUEST);
                break;
            case R.id.galleryButton:
                sendToDatabase();
                break;
        }
    }
    
    // Camera on activity for result - save it as a bmp and place in imageview
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == CAMERA_PIC_REQUEST) {
            // do something
        }
    
        if (resultCode == Activity.RESULT_OK) {
            Log.d(TAG, "result ok");
    
            picture = BitmapFactory.decodeFile("/sdcard/test.png");
    
            // Create string to place it in sd card
            String extStorageDirectory = Environment
                    .getExternalStorageDirectory().toString();
            //create output stream
            OutputStream outputStream = null;
            //create file
            File file = new File(extStorageDirectory, "test.png");
            try {
                outputStream = new FileOutputStream(file);
                picture.compress(Bitmap.CompressFormat.PNG, 80, outputStream);
                //picture.recycle();
                outputStream.flush();
                outputStream.close();
            } catch (IOException e){
                Log.d(TAG, "ERROR");
            }
            imageView.setImageBitmap(picture);
        }
    }
    
    public void sendToDatabase() {
        InputStream inputStream = null;
    
        //get the picture from location
        picture = BitmapFactory.decodeFile("/sdcard/test.png");
    
        // CONVERT:
        ByteArrayOutputStream outStream = new ByteArrayOutputStream();
        Boolean didItWork = picture.compress(Bitmap.CompressFormat.PNG, 50, outStream);
        picture.recycle();
        if (didItWork = true) {
            Log.d(TAG, "compression worked");
        }
        Log.d(TAG, "AFTER. Height: " + picture.getHeight() + " Width: "
            + picture.getWidth());
        final byte[] ba = outStream.toByteArray();
        try {
            outStream.close();
        } catch (IOException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
    }