Android how to create runtime thumbnail

后端 未结 9 986
别那么骄傲
别那么骄傲 2020-11-27 09:59

I have a large sized image. At runtime, I want to read the image from storage and scale it so that its weight and size gets reduced and I can use it as a thumbnail. When a u

9条回答
  •  萌比男神i
    2020-11-27 10:39

    The best solution I found is the following. Compared with the other solutions this one does not need to load the full image for creating a thumbnail, so it is more efficient! Its limit is that you can not have a thumbnail with exact width and height but the solution as near as possible.

    File file = ...; // the image file
    
    Options bitmapOptions = new Options();
    bitmapOptions.inJustDecodeBounds = true; // obtain the size of the image, without loading it in memory
    BitmapFactory.decodeFile(file.getAbsolutePath(), bitmapOptions);
    
    // find the best scaling factor for the desired dimensions
    int desiredWidth = 400;
    int desiredHeight = 300;
    float widthScale = (float)bitmapOptions.outWidth/desiredWidth;
    float heightScale = (float)bitmapOptions.outHeight/desiredHeight;
    float scale = Math.min(widthScale, heightScale);
    
    int sampleSize = 1;
    while (sampleSize < scale) {
        sampleSize *= 2;
    }
    bitmapOptions.inSampleSize = sampleSize; // this value must be a power of 2,
                                             // this is why you can not have an image scaled as you would like
    bitmapOptions.inJustDecodeBounds = false; // now we want to load the image
    
    // Let's load just the part of the image necessary for creating the thumbnail, not the whole image
    Bitmap thumbnail = BitmapFactory.decodeFile(file.getAbsolutePath(), bitmapOptions);
    
    // Save the thumbnail
    File thumbnailFile = ...;
    FileOutputStream fos = new FileOutputStream(thumbnailFile);
    thumbnail.compress(Bitmap.CompressFormat.JPEG, 90, fos);
    fos.flush();
    fos.close();
    
    // Use the thumbail on an ImageView or recycle it!
    thumbnail.recycle();
    

提交回复
热议问题