BitmapFactory.decodeFile总是在小米上返回null

时间:2014-10-02 18:57:54

标签: android bitmapfactory

您好我有这段代码:

编辑:

imageName = data.getData();

try{
    InputStream stream = getContentResolver().openInputStream(imageName);

    BitmapFactory.Options options = new BitmapFactory.Options();
    options.inJustDecodeBounds = true;
    bitmap = BitmapFactory.decodeStream(stream,null,options);

    final int REQUIRED_WIDTH=(int)screenWidth;
    final int REQUIRED_HIGHT=(int)screenHeight;

    int scale=1;
    while(options.outWidth/scale/2>=REQUIRED_WIDTH && options.outHeight/scale/2>=REQUIRED_HIGHT)
        scale*=2;

    BitmapFactory.Options o2 = new BitmapFactory.Options();
    o2.inSampleSize=scale;
    bitmap = BitmapFactory.decodeStream(stream, null, o2);

    if ( bitmap != null ){
        ok=true;
    }
}catch(Exception e){
    Toast.makeText(getBaseContext(),"error", Toast.LENGTH_SHORT).show();
}

但是位图仍为空

有人可以告诉我为什么吗?或更好......如何解决?

2 个答案:

答案 0 :(得分:0)

您的getPathFromUri方法失败。它应该返回像/storage/emulated/0/DCIM/camera/bla bla.jpg这样的东西。 file://是权威,不是路径的一部分。 BitmapFactory正在寻找实际的文件位置路径。

您可以手动剥离或使用Uri类来执行此类操作:

Uri imgUri = Uri.parse(imgPath);
String filePath = imgUri.getPath();

答案 1 :(得分:0)

  

好的,所以如果我现在在编辑的帖子中这样做,我怎样才能“调整大小”图像以摆脱outOfMemory异常?

啊哈!现在我们到了某个地方。

在您之前编辑的问题中,您所拥有的是:

  1. 将整个位图读入字节数组
  2. 将整个位图写入另一个字节数组作为低质量JPEG
  3. 将整个位图读入Bitmap,由第三个字节数组支持
  4. 这将导致您占用当前实现的堆空间大约2.1倍,这已经为您提供了OutOfMemoryError个消息。上面#1和#3的字节数组大小相同,等于:

    width x height x 4
    

    其中宽度和高度以像素表示。

    为减少内存消耗,您需要做的事情:

    1. 读取位图一次,就像您当前的代码一样。

    2. 使用BitmapFactory.Options来控制位图的解码。特别是,use inSampleSize可减少生成的Bitmap中的像素数。引用inSampleSize

    3. 的JavaDoc
        

      如果设置为值>如图1所示,请求解码器对原始图像进行二次采样,返回较小的图像以节省存储器。样本大小是任一维度中对应于解码位图中的单个像素的像素数。例如,inSampleSize == 4返回的图像是原始宽度/高度的1/4,像素数量的1/16。任何值< = 1都被视为1.注意:解码器使用基于2的幂的最终值,任何其他值将向下舍入到最接近的2的幂。

      This sample project演示了inSampleSize对各种硬编码值的使用。实际的Bitmap加载来自:

      private Bitmap load(String path, int inSampleSize) throws IOException {
        BitmapFactory.Options opts=new BitmapFactory.Options();
      
        opts.inSampleSize=inSampleSize;
      
        return(BitmapFactory.decodeStream(assets().open(path), null, opts));
      }