2014-10-04 79 views
0

我還沒有找到調整圖片大小的方法。在谷歌搜索之後調整圖片大小

我有我的形象 - 通過相機存儲在全分辨率 - 在

String filePath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES) + "/my_directory/my_file_name.jpg"; 

現在,我需要調整其大小保持縱橫比,然後保存到另一個路徑

什麼是最好的方式來做到這一點,而不發生錯誤「在xxxxxxx字節分配的內存不足」「?

我繼續在三星設備上檢索到這個錯誤,我嘗試了各種方式,甚至連圖書館畢加索。

謝謝!

+1

技術上減少光柵圖像總是會降低質量,因爲存儲數據的像素較少。 – Jave 2014-10-04 18:33:28

回答

0

第1件事:第一件事:根據設備和位圖大小,不管你做什麼魔法代碼,它都會崩潰!特別便宜的三星手機,其VM通常不超過16mb的內存。

您可以使用此代碼How to get current memory usage in android?來檢查可用內存量並正確處理它。

在做這些計算時,請記住位圖是未壓縮的圖像,這意味着,即使您的JPG可能爲100kb,位圖也可能需要幾MB。

您將使用此處顯示的代碼https://developer.android.com/training/displaying-bitmaps/load-bitmap.html來讀取位圖邊界,並儘可能接近您實際需要的尺寸,或足以使設備不會崩潰。這就是爲什麼正確測量內存很重要。

第一個代碼幾乎不需要RAM,因爲它是從磁盤創建的,通過簡單地跳過圖像中的像素使其更小。這就是爲什麼它是近似的,它只能在2倍的縮放比例中進行。

然後你會使用標準的API來按比例縮小到你真正需要https://developer.android.com/reference/android/graphics/Bitmap.html#createScaledBitmap(android.graphics.Bitmap大小,INT,INT,布爾)

所以它的僞代碼,將是:

try{ 
    Info info = getImageInfo(File); 
    int power2scale = calculateScale(info, w, h); 
    Bitmap smaller = preScaleFromDisk(File, power2scale); 
    Bitmap bitmap = Bitmap.createScaledBitmap(smaller, w, h, f); 
} catch(OutOfMemoryError ooe){ 
    // call GC 
    // sleep to let GC run 
    // try again with higher power2scale 
}