Creating a scaled bitmap with createScaledBitmap in Android

后端 未结 3 1965
野性不改
野性不改 2020-12-05 07:47

I want to create a scaled bitmap, but I seemingly get a dis-proportional image. It looks like a square while I want to be rectangular.

My code:

Bitma         


        
相关标签:
3条回答
  • 2020-12-05 08:19
    bmpimg = Bitmap.createScaledBitmap(srcimg, 100, 50, true);
    
    0 讨论(0)
  • 2020-12-05 08:27

    If you already have the original bitmap in memory, you don't need to do the whole process of inJustDecodeBounds, inSampleSize, etc. You just need to figure out what ratio to use and scale accordingly.

    final int maxSize = 960;
    int outWidth;
    int outHeight;
    int inWidth = myBitmap.getWidth();
    int inHeight = myBitmap.getHeight();
    if(inWidth > inHeight){
        outWidth = maxSize;
        outHeight = (inHeight * maxSize) / inWidth; 
    } else {
        outHeight = maxSize;
        outWidth = (inWidth * maxSize) / inHeight; 
    }
    
    Bitmap resizedBitmap = Bitmap.createScaledBitmap(myBitmap, outWidth, outHeight, false);
    

    If the only use for this image is a scaled version, you're better off using Tobiel's answer, to minimize memory usage.

    0 讨论(0)
  • 2020-12-05 08:31

    Your image is square because you are setting width = 960 and height = 960.

    You need to create a method where you pass the size of the image you want like this: http://developer.android.com/training/displaying-bitmaps/load-bitmap.html

    In code this looks like:

    public static Bitmap lessResolution (String filePath, int width, int height) {
        int reqHeight = height;
        int reqWidth = width;
        BitmapFactory.Options options = new BitmapFactory.Options();    
    
        // First decode with inJustDecodeBounds=true to check dimensions
        options.inJustDecodeBounds = true;
        BitmapFactory.decodeFile(filePath, options);
    
        // Calculate inSampleSize
        options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);
    
        // Decode bitmap with inSampleSize set
        options.inJustDecodeBounds = false;        
    
        return BitmapFactory.decodeFile(filePath, options); 
    }
    
    private static 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) {
            // Calculate ratios of height and width to requested height and width
            final int heightRatio = Math.round((float) height / (float) reqHeight);
            final int widthRatio = Math.round((float) width / (float) reqWidth);
    
            // Choose the smallest ratio as inSampleSize value, this will guarantee
            // a final image with both dimensions larger than or equal to the
            // requested height and width.
            inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio;
        }
        return inSampleSize;
    }
    
    0 讨论(0)
提交回复
热议问题