Resize a large bitmap file to scaled output file on Android

前端 未结 21 874
执念已碎
执念已碎 2020-11-22 05:51

I have a large bitmap (say 3888x2592) in a file. Now, I want to resize that bitmap to 800x533 and save it to another file. I normally would scale the bitmap by calling

21条回答
  •  有刺的猬
    2020-11-22 06:28

    This may be useful for someone else looking at this question. I rewrote Justin's code to allow the method to receive the target size object required as well. This works very well when using Canvas. All credit should go to JUSTIN for his great initial code.

        private Bitmap getBitmap(int path, Canvas canvas) {
    
            Resources resource = null;
            try {
                final int IMAGE_MAX_SIZE = 1200000; // 1.2MP
                resource = getResources();
    
                // Decode image size
                BitmapFactory.Options options = new BitmapFactory.Options();
                options.inJustDecodeBounds = true;
                BitmapFactory.decodeResource(resource, path, options);
    
                int scale = 1;
                while ((options.outWidth * options.outHeight) * (1 / Math.pow(scale, 2)) > 
                      IMAGE_MAX_SIZE) {
                   scale++;
                }
                Log.d("TAG", "scale = " + scale + ", orig-width: " + options.outWidth + ", orig-height: " + options.outHeight);
    
                Bitmap pic = null;
                if (scale > 1) {
                    scale--;
                    // scale to max possible inSampleSize that still yields an image
                    // larger than target
                    options = new BitmapFactory.Options();
                    options.inSampleSize = scale;
                    pic = BitmapFactory.decodeResource(resource, path, options);
    
                    // resize to desired dimensions
                    int height = canvas.getHeight();
                    int width = canvas.getWidth();
                    Log.d("TAG", "1th scale operation dimenions - width: " + width + ", height: " + height);
    
                    double y = Math.sqrt(IMAGE_MAX_SIZE
                            / (((double) width) / height));
                    double x = (y / height) * width;
    
                    Bitmap scaledBitmap = Bitmap.createScaledBitmap(pic, (int) x, (int) y, true);
                    pic.recycle();
                    pic = scaledBitmap;
    
                    System.gc();
                } else {
                    pic = BitmapFactory.decodeResource(resource, path);
                }
    
                Log.d("TAG", "bitmap size - width: " +pic.getWidth() + ", height: " + pic.getHeight());
                return pic;
            } catch (Exception e) {
                Log.e("TAG", e.getMessage(),e);
                return null;
            }
        }
    

    Justin's code is VERY effective at reducing the overhead of working with large Bitmaps.

提交回复
热议问题