Image compression like Whatsapp and other messengers on Android

后端 未结 4 711
孤街浪徒
孤街浪徒 2020-12-04 20:31

I am using the following code for image compression.

The code compresses image files that are larger than 2 MB.

But this code takes time and image quality st

4条回答
  •  萌比男神i
    2020-12-04 20:56

    Try this code

    private void previewCapturedImage() {
        try {
    
            int targetW = 450;
            int targetH = 450;
            Log.e("Get w", "width" + targetW);
            Log.e("Get H", "height" + targetH);
            // Get the dimensions of the bitmap
            BitmapFactory.Options bmOptions = new BitmapFactory.Options();
            bmOptions.inJustDecodeBounds = true;
            BitmapFactory.decodeFile(filename, bmOptions);
            int photoW = bmOptions.outWidth;
            int photoH = bmOptions.outHeight;
    
            // Determine how much to scale down the image
            int scaleFactor = Math.min(photoW / targetW, photoH / targetH);
    
            // Decode the image file into a Bitmap sized to fill the View
            bmOptions.inJustDecodeBounds = false;
            bmOptions.inSampleSize = scaleFactor << 1;
            bmOptions.inPurgeable = true;
            Bitmap bitmap = BitmapFactory.decodeFile(filename, bmOptions);
    
            Matrix mtx = new Matrix();
    
            try {
    
                File imageFile = new File(filename);
                imageFile1 = imageFile;
                ExifInterface exif = new ExifInterface(
                        imageFile.getAbsolutePath());
                int orientation = exif.getAttributeInt(
                        ExifInterface.TAG_ORIENTATION,
                        ExifInterface.ORIENTATION_NORMAL);
                Log.e("Orintation", "  :-" + orientation);
                switch (orientation) {
                case ExifInterface.ORIENTATION_ROTATE_270:
    
                    mtx.postRotate(270);
                    rotatedBMP = Bitmap.createBitmap(bitmap, 0, 0,
                            bitmap.getWidth(), bitmap.getHeight(), mtx, true);
                    if (rotatedBMP != bitmap)
                        bitmap.recycle();
                    imgPreview.setImageBitmap(rotatedBMP);
                    break;
                case ExifInterface.ORIENTATION_ROTATE_180:
    
                    mtx.postRotate(180);
                    rotatedBMP = Bitmap.createBitmap(bitmap, 0, 0,
                            bitmap.getWidth(), bitmap.getHeight(), mtx, true);
                    if (rotatedBMP != bitmap)
                        bitmap.recycle();
                    imgPreview.setImageBitmap(rotatedBMP);
                    break;
                case ExifInterface.ORIENTATION_ROTATE_90:
    
                    mtx.postRotate(90);
                    rotatedBMP = Bitmap.createBitmap(bitmap, 0, 0,
                            bitmap.getWidth(), bitmap.getHeight(), mtx, true);
                    if (rotatedBMP != bitmap)
                        bitmap.recycle();
                    imgPreview.setImageBitmap(rotatedBMP);
                    break;
                case ExifInterface.ORIENTATION_NORMAL:
    
                    mtx.postRotate(0);
                    rotatedBMP = Bitmap.createBitmap(bitmap, 0, 0,
                            bitmap.getWidth(), bitmap.getHeight(), mtx, true);
                    if (rotatedBMP != bitmap)
                        bitmap.recycle();
                    imgPreview.setImageBitmap(rotatedBMP);
                    break;
                default:
                    mtx.postRotate(0);
                    rotatedBMP = Bitmap.createBitmap(bitmap, 0, 0,
                            bitmap.getWidth(), bitmap.getHeight(), mtx, true);
                    if (rotatedBMP != bitmap)
                        bitmap.recycle();
                    imgPreview.setImageBitmap(rotatedBMP);
                    // img_profilepic.setImageBitmap(BitmapFactory
                    // .decodeFile(mCurrentPhotoPath));
    
                }
                double megabytes = 0;
                if (imageFile1.exists()) {
    
                    double bytes = imageFile1.length();
                    double kilobytes = (bytes / 1024);
                    megabytes = (kilobytes / 1024);
                    double gigabytes = (megabytes / 1024);
                    double terabytes = (gigabytes / 1024);
                    double petabytes = (terabytes / 1024);
                    double exabytes = (petabytes / 1024);
                    double zettabytes = (exabytes / 1024);
                    double yottabytes = (zettabytes / 1024);
                    Log.e("Image Size After in KB", "20th May:" + kilobytes);
                    Log.e("Image Size After in MB", "20th May:" + megabytes);
    
                }
                int AfterSize = rotatedBMP.getRowBytes()
                        * rotatedBMP.getHeight();
                Log.e("After Compress Withd ",
                        "21st May ::" + rotatedBMP.getWidth());
                Log.e("After Compress Withd ",
                        "21st May ::" + rotatedBMP.getWidth());
                Log.i("RotateImage", "Exif orientation: " + orientation);
                tv_After.setText("After Width:" + rotatedBMP.getWidth()
                        + " :Height:" + rotatedBMP.getHeight() + ":in MB :"
                        + megabytes + " :Bitmap: " + AfterSize);
            } catch (Exception e) {
                e.printStackTrace();
            }
    
        } catch (NullPointerException e) {
            e.printStackTrace();
        }
    }
    

    also put this method.

    public int calculateInSampleSize(BitmapFactory.Options options,
            int reqWidth, int reqHeight) {
        final int height = options.outHeight;
        final int width = options.outWidth;
        int inSampleSize = 1;
    
        if (height > reqHeight || width > reqWidth) {
            final int heightRatio = Math.round((float) height
                    / (float) reqHeight);
            final int widthRatio = Math.round((float) width / (float) reqWidth);
            inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio;
        }
        final float totalPixels = width * height;
        final float totalReqPixelsCap = reqWidth * reqHeight * 2;
        while (totalPixels / (inSampleSize * inSampleSize) > totalReqPixelsCap)     {
            inSampleSize++;
        }
        Log.e("In Sample Size..", "19th May :-" + inSampleSize);
        return inSampleSize;
    }
    

提交回复
热议问题