2014-10-02 87 views
0
返回null

你好,我有這樣的一段代碼:BitmapFactory.decodeFile總是小蜜

編輯:

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

但位圖仍然是空

誰能告訴我爲什麼?或更好的...如何解決它?

+0

什麼是'getPathFromURI()'?如果這是我認爲的那樣,請刪除它,因爲[Uri'不一定是'File'](http://commonsware.com/blog/2014/07/04/uri-not-necessarily -file.html)。 – CommonsWare 2014-10-02 19:05:17

+0

我不明白。我將在這裏添加方法 – 2014-10-02 19:06:42

+0

刪除該方法。閱讀[我鏈接到的博客文章](http://commonsware.com/blog/2014/07/04/uri-not-necessarily-file.html)。使用'ContentResolver'上的'openInputStream()'讀入'Uri'處的數據。 – CommonsWare 2014-10-02 19:09:29

回答

0

好了,如果喜歡它現在在編輯文章中,我會做到這一點,我怎麼能「調整」了圖像擺脫outOfMemory異常?

啊哈!現在我們正在某個地方。

你有什麼,在你的問題的前編輯,是:

  1. 讀取整個位圖到一個字節數組
  2. 寫入整個位圖到另一個字節數組作爲一個低質量的JPEG
  3. 讀取整個位圖到一個Bitmap,通過又一第三字節數組支持

這將導致你的消費〜2.1X您當前的實現,這是的堆空間已經給你OutOfMemoryError消息。上面#1和#3的字節數組大小相同,等於:

width x height x 4 

其中寬度和高度用像素表示。

爲了減少您的內存消耗,你需要做的事情:

  1. 讀取位圖一次,作爲當前的代碼一樣。

  2. 使用BitmapFactory.Options來控制位圖的解碼。特別是use inSampleSize可以減少由此產生的Bitmap中的像素數量。引述JavaDoc中inSampleSize

如果設置爲值> 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)); 
} 
0

您的getPathFromUri方法失敗。它應該返回像/storage/emulated/0/DCIM/camera/bla bla.jpgfile://是權威,並不是路徑的一部分。 BitmapFactory正在尋找一個實際的文件位置路徑。

您可以手動帶,其或使用Uri類是這樣的:

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

Stil不工作...現在文件:///不見了但仍然變爲空 – 2014-10-02 19:17:28

+0

請檢查我的更新 – 2014-10-02 19:29:26

相關問題