2017-09-14 69 views
8

我正在嘗試計算可以使用自定義相機拍攝的照片的剩餘數量,並將該數值顯示給用戶。我試着用下面的代碼:如何計算自定義相機中的其餘照片計數android

private void numberOfPhotosAvailable() { 
     long photosAvailable = 0; 
     StatFs stat = new StatFs(Environment.getExternalStorageDirectory().getPath()); 
     resolution=getResolution(); 
     long bytesPerPhoto=resolution/1048576; 
     long bytesAvailable = (long) stat.getAvailableBlocksLong() * (long) stat.getBlockSizeLong(); 
     long megAvailable = bytesAvailable/1048576; 

     System.out.println("Megs :" + megAvailable); 
     photosAvailable = megAvailable/bytesPerPhoto; 
     tvAvailablePhotos.setText("" + photosAvailable); 
    } 

獲得分辨率的方法。

public long getResolution(){ 
     long resolution=0; 
     Camera.Parameters params=mCamera.getParameters(); 
     List<Camera.Size> sizes = params.getSupportedPictureSizes(); 

     Camera.Size size = sizes.get(0); 
     int width=size.width; 
     int height=size.height; 
     resolution=width*height; 
     return resolution; 
    } 

問題: 有在手機的攝像頭顯示的數量相差很多,並且在我的應用中顯示計數。

那麼這樣做的正確方法是什麼?

注意:我只會捕捉最高質量的圖像。所以我只是按照一個分辨率來計算。

+0

爲什麼你會認爲照片將是7MB?這些是壓縮文件。取決於實際捕獲的數據,它可能遠不及或更多。假設您沒有按照應用程序的最大存儲限制達到特定供應商。而且您假設所有相機都以相同的分辨率拍攝照片,但事實並非如此。 –

+0

這就是爲什麼我要問做什麼計算的正確方法。我知道上面的代碼不適用於其他設備。 –

+0

@GabeSechan現在檢查。我現在使用動態方法進行計算。 –

回答

2

那麼經過大量的研究和谷歌搜索,我來到this網站。

根據這個網站,以下是獲取文件大小的步驟。

  1. 將檢測器的水平像素數乘以垂直像素的數目以獲得檢測器的總像素數。
  2. 將檢測器的位深度乘以總像素數(16位,14位等)以獲得數據的總位數。
  3. 將總位數除以8等於文件大小(以字節爲單位)。
  4. 將字節數除以1024以獲得以千字節爲單位的文件大小。再次除以1024,得到文件大小爲兆字節。

所以當我按照上面的步驟,即我的探測器分辨率是5376X3024。繼續上述步驟,我終於得到了39 MB作爲圖像大小的答案。

但是相機拍攝的圖像大小在8-10 MB左右,與上述結果相差甚遠。

我的手機(HTC Desire 10 pro)擁有專業模式設置。在這種模式下,照片被捕獲爲原始圖像。所以當我檢查捕獲的原始圖像的大小時,我感到很開心,因爲原始文件的大小確實在39 MB左右,這說明上述步驟對於計算圖像的原始大小是正確的。

結論

隨着我來到了結論,即手機的軟件確實使用一些壓縮算法,使圖像尺寸小於上述步驟。所以我比較的是實際上壓縮的圖像,因此圖像的數量是不同的。

問題解決

,我現在的目標是從我的相機拿到最後點擊圖像,根據該文件的大小得到其文件大小和顯示計數的方法。這也將是一個近似的結果,但我不認爲可以有任何解決方案獲得確切的數量。

這是我使用來實現上述溶液

private void numberOfPhotosAvailable() { 
    long photosAvailable = 0; 
    StatFs stat = new StatFs(Environment.getExternalStorageDirectory().getPath()); 
    File lastFile=null; 
    lastFile=utils.getLatestFilefromDir(prefManager.getString(PrefrenceConstants.STORAGE_PATH)); 
    if (lastFile!=null){ 
     double fileSize=(lastFile.length())/(1024*1024); 
     long bytesAvailable = (long) stat.getAvailableBlocksLong() * (long) stat.getBlockSizeLong(); 
     long megAvailable = bytesAvailable/1048576; 

     System.out.println("Megs :" + megAvailable); 
     photosAvailable = (long) (megAvailable/fileSize); 
     tvAvailablePhotos.setText("" + photosAvailable); 
    }else{ 
     tvAvailablePhotos.setVisibility(View.INVISIBLE); 
    } 

} 
+0

當然,JPEG文件是壓縮的。您可以通過setJpegQuality(int)方法指定壓縮級別。我通常在70-90的範圍內使用它,以保持高質量的圖像,同時大大減少它們的尺寸。 – rommex

+0

@rommex不明白你的評論是什麼意思? –

+0

基本上,我在說如果您使用的是非原始格式,您無法預測圖像文件的大小。這種格式使用壓縮。 – rommex

5

無法找到JPEG/PNG壓縮的輸出圖像的確切尺寸。壓縮算法的優化方式是儘可能減小尺寸,但保留圖像像素(儘管JPEG稍有損失)。

但是,您可以通過拍攝多張樣本照片並計算平均壓縮比來估計圖像的數量。

Wikipedia

JPEG通常具有10:1的壓縮用在圖象質量小明顯的損失。

int bytes = width * height * 2/compressionRatio; 

在這裏它是由2因爲在RGB_565配置,它需要2個字節來存儲1個像素乘以:

所以估計存儲大小可以計算。

+0

我將如何獲得壓縮比。我認爲它會過於謹慎,從手機到手機 –

+0

是的,它會因手機而異,這就是爲什麼你應該考慮平均價值。不僅從手機到手機,即使在一部手機中,照片也不盡相同。您可以計算多個樣本的壓縮比並對其進行平均,或者在Google中搜索其他結果。 –

+0

如何從程序化照片獲取壓縮比率? –

2

我認爲沒有最終的解決方案留下的圖像,因爲有太多不同的設備和相機,它也很大程度上取決於圖像內容。對於

一個很好的解釋,我發現here

至於建議,然後才能預測圖像大小和計算的圖像,計數基於設備的可用空間留下。爲了得到這個預測,最好的解決方案是首先在你的設備上試用它。 用戶開始使用該應用程序後,可以在計算中包含他最近的10張照片尺寸。 如果它不是一個關鍵功能,您可以將它作爲基於使用情況的預測來呈現,而不是作爲約束事實。

P.S 我正在使用三星Galaxy S7邊緣,根本沒有相機留在計算機中。 (或者我只是無法找到它)

1

我想你可以檢查的文件數量的DCIM目錄(默認相機目錄),並計算所有文件的大小不同的代碼和通過劃分文件數來獲得平均大小。

和你會得到平均大小的相機捕捉圖像 在Asynctask上面的步驟。

並且您已經以剩餘字節數計算剩餘大小,現在再將剩餘大小除以平均大小,您將獲得大約可以捕獲的圖像數。

相關問題