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

17

如果您有一个 Uri 并且需要 Bitmap,理论上您可以这样做。

Bitmap troublinglyLargeBmp =
  MediaStore.Images.Media.getBitmap(
      State.mainActivity.getContentResolver(), theUri );

但是它每次都会崩溃,

所以你需要这样做……

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() );

那太棒了,这是可行的解决方案。

请注意"four"因子在目前条件下(2014年)与 typlical 相机大小等相匹配。然而,最好是猜测或学习 at theUri 中图像数据的确切大小,然后使用该信息智能选择该因子

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

Android 专家们,这是一个众所周知的问题吗?有没有解决方案?感谢你们来自 iOS->Android 的朋友!:)

1个回答

27

请查看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;

编辑

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

BitmapFactory.decodeFileDescriptor(fileDescriptor.getFileDescriptor(), null, options);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接