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.
Author by
Splitusa
Updated on June 04, 2022Comments
-
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(); } }