在android上將大位圖文件調整為縮放輸出文件我在一個文件中有一個大位圖(比如3888x2592)。現在,我希望將該位圖調整為800x533,并將其保存到另一個文件中。我通常會通過調用Bitmap.createBitmap方法,但它需要一個源位圖作為第一個參數,但我無法提供這個參數,因為將原始圖像加載到Bitmap對象中當然會超出內存(請參見這里例如)。我也不能讀位圖,例如,BitmapFactory.decodeFile(file, options),提供BitmapFactory.Options.inSampleSize,因為我想把它調整到精確的寬度和高度。使用inSampleSize將位圖調整為972x648(如果我使用inSampleSize=4)或至778x518(如果我使用inSampleSize=5,這甚至不是一種力量。我還想避免使用inSampleSize讀取圖像,例如,在第一步中使用972x648,然后在第二步將其調整到精確的800x533,因為與原始圖像的直接調整相比,質量會很差??偨Y我的問題:是否有一種方法可以讀取10 MP或更多的大型圖像文件,并將其保存到新的圖像文件中,調整到特定的新寬度和高度,而無需獲得OutOfMemory異常?我也試過BitmapFactory.decodeFile(file, options)并手動將Options.outHight和Options.outWidth值設置為800和533,但它不是這樣工作的。
3 回答

HUH函數
TA貢獻1836條經驗 獲得超4個贊
沒有。
計算最大可能 inSampleSize
它仍然產生一個比你的目標大的圖像。 使用 BitmapFactory.decodeFile(file, options)
,將SampleSize作為選項傳遞。 使用 Bitmap.createScaledBitmap()
.

慕容708150
TA貢獻1831條經驗 獲得超4個贊
private?Bitmap?getBitmap(String?path)?{Uri?uri?=?getImageUri(path);InputStream?in?=?null;try?{ ????final?int?IMAGE_MAX_SIZE?=?1200000;?//?1.2MP ????in?=?mContentResolver.openInputStream(uri); ????//?Decode?image?size ????BitmapFactory.Options?options?=?new?BitmapFactory.Options(); ????options.inJustDecodeBounds?=?true; ????BitmapFactory.decodeStream(in,?null,?options); ????in.close(); ????int?scale?=?1; ????while?((options.outWidth?*?options.outHeight)?*?(1?/?Math.pow(scale,?2))?>? ??????????IMAGE_MAX_SIZE)?{ ???????scale++; ????} ????Log.d(TAG,?"scale?=?"?+?scale?+?",?orig-width:?"?+?options.outWidth?+?",? ???????orig-height:?"?+?options.outHeight); ????Bitmap?resultBitmap?=?null; ????in?=?mContentResolver.openInputStream(uri); ????if?(scale?>?1)?{ ????????scale--; ????????//?scale?to?max?possible?inSampleSize?that?still?yields?an?image ????????//?larger?than?target ????????options?=?new?BitmapFactory.Options(); ????????options.inSampleSize?=?scale; ????????resultBitmap?=?BitmapFactory.decodeStream(in,?null,?options); ????????//?resize?to?desired?dimensions ????????int?height?=?resultBitmap.getHeight(); ????????int?width?=?resultBitmap.getWidth(); ????????Log.d(TAG,?"1th?scale?operation?dimenions?-?width:?"?+?width?+?", ???????????height:?"?+?height); ????????double?y?=?Math.sqrt(IMAGE_MAX_SIZE????????????????/?(((double)?width)?/?height)); ????????double?x?=?(y?/?height)?*?width; ????????Bitmap?scaledBitmap?=?Bitmap.createScaledBitmap(resultBitmap,?(int)?x,? ???????????(int)?y,?true); ????????resultBitmap.recycle(); ????????resultBitmap?=?scaledBitmap; ????????System.gc(); ????}?else?{ ????????resultBitmap?=?BitmapFactory.decodeStream(in); ????} ????in.close(); ????Log.d(TAG,?"bitmap?size?-?width:?"?+resultBitmap.getWidth()?+?",?height:?"?+? ???????resultBitmap.getHeight()); ????return?resultBitmap;}?catch?(IOException?e)?{ ????Log.e(TAG,?e.getMessage(),e); ????return?null;}
- 3 回答
- 0 關注
- 361 瀏覽
添加回答
舉報
0/150
提交
取消