title: Android - compress bitmap before saving it to SDCARD in activity for result
body: <p>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. </p>
  
  <p>Thanks for your help</p>
  
  <p>Here is my code:</p>
  
  <pre><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();
      }
  }
  </code></pre>