How to get Bitmap from an Uri?

前端 未结 16 1365
时光说笑
时光说笑 2020-11-22 10:41

How to get a Bitmap object from an Uri (if I succeed to store it in /data/data/MYFOLDER/myimage.png or file///data/data/MYFOLDER/myimage.png) to u

16条回答
  •  北恋
    北恋 (楼主)
    2020-11-22 11:03

    Here's the correct way of doing it, keeping tabs on memory usage as well:

    protected void onActivityResult(int requestCode, int resultCode, Intent data)
    {
      super.onActivityResult(requestCode, resultCode, data);
      if (resultCode == RESULT_OK)
      {
        Uri imageUri = data.getData();
        Bitmap bitmap = getThumbnail(imageUri);
      }
    }
    
    public static Bitmap getThumbnail(Uri uri) throws FileNotFoundException, IOException{
      InputStream input = this.getContentResolver().openInputStream(uri);
    
      BitmapFactory.Options onlyBoundsOptions = new BitmapFactory.Options();
      onlyBoundsOptions.inJustDecodeBounds = true;
      onlyBoundsOptions.inDither=true;//optional
      onlyBoundsOptions.inPreferredConfig=Bitmap.Config.ARGB_8888;//optional
      BitmapFactory.decodeStream(input, null, onlyBoundsOptions);
      input.close();
    
      if ((onlyBoundsOptions.outWidth == -1) || (onlyBoundsOptions.outHeight == -1)) {
        return null;
      }
    
      int originalSize = (onlyBoundsOptions.outHeight > onlyBoundsOptions.outWidth) ? onlyBoundsOptions.outHeight : onlyBoundsOptions.outWidth;
    
      double ratio = (originalSize > THUMBNAIL_SIZE) ? (originalSize / THUMBNAIL_SIZE) : 1.0;
    
      BitmapFactory.Options bitmapOptions = new BitmapFactory.Options();
      bitmapOptions.inSampleSize = getPowerOfTwoForSampleRatio(ratio);
      bitmapOptions.inDither = true; //optional
      bitmapOptions.inPreferredConfig=Bitmap.Config.ARGB_8888;//
      input = this.getContentResolver().openInputStream(uri);
      Bitmap bitmap = BitmapFactory.decodeStream(input, null, bitmapOptions);
      input.close();
      return bitmap;
    }
    
    private static int getPowerOfTwoForSampleRatio(double ratio){
      int k = Integer.highestOneBit((int)Math.floor(ratio));
      if(k==0) return 1;
      else return k;
    }
    

    The getBitmap() call from Mark Ingram's post also calls the decodeStream(), so you don't lose any functionality.

    References:

    • Android: Get thumbnail of image on SD card, given Uri of original image

    • Handling large Bitmaps

提交回复
热议问题