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

前端 未结 6 1315
隐瞒了意图╮
隐瞒了意图╮ 2020-12-13 14:11

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 c

相关标签:
6条回答
  • 2020-12-13 14:44

    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);  
    } 
    
    0 讨论(0)
  • 2020-12-13 14:52

    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()
        }
    }
    
    0 讨论(0)
  • You can use Bitmap.createScaledBitmap (Bitmap src, int dstWidth, int dstHeight, boolean filter)

    0 讨论(0)
  • 2020-12-13 14:55

    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();

    0 讨论(0)
  • 2020-12-13 14:56

    I found this useful library for this achievement: https://github.com/hkk595/Resizer

    0 讨论(0)
  • 2020-12-13 15:01

    You should ideally use multitouch instead of using a button to increase/decrease width. Here's an amazing library. Once the user decides to save the image, the image translation matrix must be stored persistently (in your sqlite database). Next time the user opens the image, you need to recall the matrix and apply it to your image.

    I've actually done this before.

    0 讨论(0)
提交回复
热议问题