在缩放加载之前,从实际Uri预先猜测Bitmap的大小

Fat*_*tie 14 android android-camera bitmapfactory

如果你有一个Uri并且你需要它Bitmap,理论上你可以做到这一点

Bitmap troublinglyLargeBmp =
  MediaStore.Images.Media.getBitmap(
      State.mainActivity.getContentResolver(), theUri );
Run Code Online (Sandbox Code Playgroud)

但它每次都会崩溃,

所以你这样做.........

BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 4;

AssetFileDescriptor fileDescriptor =null;
fileDescriptor =
  State.mainActivity.getContentResolver().openAssetFileDescriptor( theUri, "r");

Bitmap actuallyUsableBitmap
  = BitmapFactory.decodeFileDescriptor(
    fileDescriptor.getFileDescriptor(), null, options);

Utils.Log("'4-sample' method bitmap ... "
   +actuallyUsableBitmap.getWidth() +" "
   +actuallyUsableBitmap.getHeight() );
Run Code Online (Sandbox Code Playgroud)

太棒了,是工作的解决方案.

请注意,在当前条件下(2014年),典型的相机尺寸等,"四"因子往往效果很好.但是,最好在Uri猜测或准确了解图像数据的大小,然后使用它信息,智能地选择那个因素.

简而言之,如何在加载Uri时正确选择该比例因子

Android专家,这是一个众所周知的问题,有没有解决方案?感谢您的iOS-> Android好友!:)

Dav*_*sey 26

请参阅Android指南以处理大型位图.

具体这一部分:

BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeResource(getResources(), R.id.myimage, options);
int imageHeight = options.outHeight;
int imageWidth = options.outWidth;
String imageType = options.outMimeType;
Run Code Online (Sandbox Code Playgroud)

编辑

在您的情况下,您将用以下内容替换该decodeResource行:

BitmapFactory.decodeFileDescriptor(fileDescriptor.getFileDescriptor(), null, options);
Run Code Online (Sandbox Code Playgroud)