2012-05-22 101 views
1

這可能聽起來像一個奇怪的/愚蠢的問題。但是聽我說。Android拍照成功

Android應用是,至少在T-Mobile的G1,限制爲16 MB堆的。

而且它需要每像素來存儲的圖像的4個字節(以位圖形式):

public void onPictureTaken(byte[] _data, Camera _camera) { 
    Bitmap temp = BitmapFactory.decodeByteArray(_data, 0, _data.length); 
}   

所以1個圖像,在600萬像素的佔用堆24MB。 (提示內存溢出)。

現在我非常瞭解使用參數進行解碼的能力,可以有效地減小圖像的大小。我甚至有一種方法將它縮小到所需的大小。

但是在場景中,如果我想將相機用作高質量相機,情況如何!

我不知道如何讓這個圖像進入數據庫。只要我解碼,它錯誤。

注:我需要(?)將其轉換爲位圖,以便在存儲它之前旋轉它。

所以總結起來:

  • 有限公司堆的16MB
  • 圖片佔用堆24MB
  • 沒有足夠的空間來採取和處理圖像

這並不解決問題,但我推薦它作爲其他人剛剛從一個位置加載圖像的起點: Displaying Bitmaps on android

回答

3

我只能想到兩件事情,可以幫助的,他們都不是最佳

  1. 做你的旋轉服務器端

  2. 將數據從捕獲直接存儲到SDCARD而不解碼,然後使用文件系統按塊大小旋轉塊,然後將其發送到您的數據庫。很多網絡上的例子(如果你的角度很簡單,90 180等),雖然這會很費時,因爲對SDCARD的IO操作並不是很快。

  3. 當你解碼下降alpha通道,這可能不是解決你雖然發出,如果您使用的是矩陣旋轉圖像,那麼你就需要一個目標/源反正

    選項選擇=新的選項( );

    opt.inPreferredConfig = Bitmap.Config。RGB_565;

    //將原始相機解碼爲沒有alpha通道的位圖
    bmp = BitmapFactory.decodeByteArray(raw,0,raw.length,opt);


可能有更好的方法來做到這一點,但由於您的設備堆等非常有限,我不能認爲任何。

這將是很好,如果有一個可選的基於文件的矩陣方法(這通常是我所建議的選項2)或某種類型的「分頁」系統的Android,但這是最好的,我可以上來。

+0

這確實是實現您的目標的最明智的方式。理想情況下,你想做任何繁重的服務器端,因爲你的手機沒有太多的處理能力,特別是G1。 – mtmurdock

+0

我實際上在HTC One X上測試,但由於應用程序堆大小的限制,無法執行操作。另外它還需要在OS 10上工作。感謝您的建議,明天將嘗試2號。看看3,它只會降低4個通道中的1個。我的相機是8百萬像素,所以仍然是24MB,加上反正使用的內存越少越好。 – Doomsknight

+0

@idistic - 在縱向模式下正確預覽它我的一些android設置代碼,設置'mCamera.setDisplayOrientation(result)'。 AKa在預覽中看到的內容。它剛剛發生在我看來,這不是假設旋轉相機,事實上,我然後找到了適當的方法來旋轉攝像頭「參數」內的相機。 'mParameters.setRotation(90);'這樣我就不必創建一個位圖,因此可以直接存儲數據庫一個1MB的JPEG數組。儘管你自己有一些很好的選擇。如果你想添加一個數字4.這將是偉大的:) – Doomsknight

0

首先將其保存到文件系統,從文件系統文件做你的操作...

+0

它作爲一個數組(存儲在數據庫中)存儲。 – Doomsknight

+0

@Doomsknight - 爲什麼不直接在數據庫中存儲圖像路徑,然後將實際圖像存儲在文件系統中? – dymmeh

+0

因爲它與桌面應用程序數據庫以及其他設備同步。只需傳遞一個數組,而不必根據存儲位置的設備更新圖像引用。 – Doomsknight