Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Pick image from sd card, resize the image and save it back to sd card

I am working on an application, in which I need to pick an image from sd card and show it in image view. Now I want the user to decrease/increase its width by clicking a button and then save it back to the sd card.

I have done the image picking and showing it on ui. But unable to find how to resize it.Can anyone please suggest me how to achieve it.

like image 735
Ashish Kumar Avatar asked Jul 27 '12 13:07

Ashish Kumar


3 Answers

Just yesterday i have done this

File dir=Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM); Bitmap b= BitmapFactory.decodeFile(PATH_ORIGINAL_IMAGE); Bitmap out = Bitmap.createScaledBitmap(b, 320, 480, false);  File file = new File(dir, "resize.png"); FileOutputStream fOut; try {     fOut = new FileOutputStream(file);     out.compress(Bitmap.CompressFormat.PNG, 100, fOut);     fOut.flush();     fOut.close();     b.recycle();     out.recycle();                } catch (Exception e) {} 

Also don't forget to recycle your bitmaps: It will save memory.

You can also get path of new created file String: newPath=file.getAbsolutePath();

like image 156
MAC Avatar answered Nov 03 '22 05:11

MAC


Solution without OutOfMemoryException in Kotlin

fun resizeImage(file: File, scaleTo: Int = 1024) {
    val bmOptions = BitmapFactory.Options()
    bmOptions.inJustDecodeBounds = true
    BitmapFactory.decodeFile(file.absolutePath, bmOptions)
    val photoW = bmOptions.outWidth
    val photoH = bmOptions.outHeight

    // Determine how much to scale down the image
    val scaleFactor = Math.min(photoW / scaleTo, photoH / scaleTo)

    bmOptions.inJustDecodeBounds = false
    bmOptions.inSampleSize = scaleFactor

    val resized = BitmapFactory.decodeFile(file.absolutePath, bmOptions) ?: return
    file.outputStream().use {
        resized.compress(Bitmap.CompressFormat.JPEG, 75, it)
        resized.recycle()
    }
}
like image 29
Dima Rostopira Avatar answered Nov 03 '22 03:11

Dima Rostopira


Try using this method:

public static Bitmap scaleBitmap(Bitmap bitmapToScale, float newWidth, float newHeight) {   
if(bitmapToScale == null)
    return null;
//get the original width and height
int width = bitmapToScale.getWidth();
int height = bitmapToScale.getHeight();
// create a matrix for the manipulation
Matrix matrix = new Matrix();

// resize the bit map
matrix.postScale(newWidth / width, newHeight / height);

// recreate the new Bitmap and set it back
return Bitmap.createBitmap(bitmapToScale, 0, 0, bitmapToScale.getWidth(), bitmapToScale.getHeight(), matrix, true);  
} 
like image 43
Nermeen Avatar answered Nov 03 '22 03:11

Nermeen