我有两张相同的照片。其中一个在应用程序的资源文件夹(默认可绘制)中,另一个在外部存储中。
我得到带有以下代码的Bitmap

 // Get from storage
 BitmapFactory.decodeFile(image.getAbsolutePath());

 // Get from resource
 BitmapFactory.decodeResource(getResources(), R.drawable.image);

但是,它们在ImageView中导致不同的大小,在高度和宽度上导致wrap_content。我该怎么解决?

最佳答案

这种行为是因为BitmapFactory的实现。在从decodeResourceStream调用decodeResource期间,如果BitmapFactory.Options为空,它将把inDensitywtihDisplayMetrics.DENSITY_DEFAULT设置为BitmapFactory.Options
另一方面,decodeFile通过setDensityFromOptions传递,如果BitmapFactory.Options为空,则立即返回。
因此,解决方案之一是通过以下代码缩放decodeFile的密度。

BitmapFactory.Options option = new BitmapFactory.Options();
option.inDensity = DisplayMetrics.DENSITY_DEFAULT;
Bitmap bitmap = BitmapFactory.decodeFile(image.getAbsolutePath(), option);

如果要反向执行,可以使用以下代码。
InputStream inputStream = context.getResources().openRawResource(R.drawable.image);
Bitmap bitmap = BitmapFactory.decodeStream(inputStream);

注意,将有“常量和资源类型不匹配”,但它仍然可以被编译。decodeResource也可以将openRawResource称为InputStream,这样就可以了。

关于android - BitmapFactory从可绘制和文件中返回位图的差异大小,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37922725/

10-10 10:16