導航:首頁 > 操作系統 > androidsetbitmap

androidsetbitmap

發布時間:2025-05-10 18:09:51

⑴ 如何解決bitmap 內存溢出out of memory的問題

android 中用bitmap 時很容易內存溢出,報如下錯誤:Java.lang.OutOfMemoryError : bitmap size exceeds VM budget
● 主要是加上這段:
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 2;
● eg1:(通過Uri取圖片)
private ImageView preview;
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 2;//圖片寬高都為原來的二分之一,即圖片為原來的四分之一
Bitmap bitmap = BitmapFactory.decodeStream(cr
.openInputStream(uri), null, options);
preview.setImageBitmap(bitmap);
以上代碼可以優化內存溢出,但它只是改變圖片大小,並不能徹底解決內存溢出。
● eg2:(通過路徑去圖片)
private ImageView preview;
private String fileName= "/sdcard/DCIM/Camera/2010-05-14 16.01.44.jpg";
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 2;//圖片寬高都為原來的二分之一,即圖片為原來的四分之一
Bitmap b = BitmapFactory.decodeFile(fileName, options);
preview.setImageBitmap(b);
filePath.setText(fileName);
★Android 還有一些性能優化的方法:
● 首先內存方面,可以參考 Android堆內存也可自己定義大小 和 優化Dalvik虛擬機的堆內存分配
● 基礎類型上,因為Java沒有實際的指針,在敏感運算方面還是要藉助NDK來完成。Android123提示游戲開發者,這點比較有意思的是Google推出NDK可能是幫助游戲開發人員,比如OpenGL ES的支持有明顯的改觀,本地代碼操作圖形界面是很必要的。
● 圖形對象優化,這里要說的是Android上的Bitmap對象銷毀,可以藉助recycle()方法顯示讓GC回收一個Bitmap對象,通常對一個不用的Bitmap可以使用下面的方式,如
if(bitmapObject.isRecycled()==false) //如果沒有回收
bitmapObject.recycle();
● 目前系統對動畫支持比較弱智對於常規應用的補間過渡效果可以,但是對於游戲而言一般的美工可能習慣了GIF方式的統一處理,目前 Android系統僅能預覽GIF的第一幀,可以藉助J2ME中通過線程和自己寫解析器的方式來讀取GIF89格式的資源。
● 對於大多數Android手機沒有過多的物理按鍵可能我們需要想像下了做好手勢識別 GestureDetector 和重力感應來實現操控。通常我們還要考慮誤操作問題的降噪處理。
Android堆內存也可自己定義大小
對於一些大型Android項目或游戲來說在演算法處理上沒有問題外,影響性能瓶頸的主要是Android自己內存管理機制問題,目前手機廠商對RAM都比較吝嗇,對於軟體的流暢性來說RAM對性能的影響十分敏感,除了上次Android開發網提到的 優化Dalvik虛擬機的堆內存分配外,我們還可以強制定義自己軟體的對內存大小,我們使用Dalvik提供的 dalvik.system.VMRuntime類來設置最小堆內存為例:
private final static int CWJ_HEAP_SIZE = 6* 1024* 1024 ;
VMRuntime.getRuntime().setMinimumHeapSize(CWJ_HEAP_SIZE); //設置最小heap內存為6MB大小。當然對於內存吃緊來說還可以通過手動干涉GC去處理,我們將在下次提到具體應用。
優化Dalvik虛擬機的堆內存分配
對於Android平台來說,其託管層使用的Dalvik JavaVM從目前的表現來看還有很多地方可以優化處理,比如我們在開發一些大型游戲或耗資源的應用中可能考慮手動干涉GC處理,使用 dalvik.system.VMRuntime類提供的setTargetHeapUtilization方法可以增強程序堆內存的處理效率。當然具體原理我們可以參考開源工程,這里我們僅說下使用方法: private final static floatTARGET_HEAP_UTILIZATION = 0.75f; 在程序onCreate時就可以調用 VMRuntime.getRuntime().setTargetHeapUtilization(TARGET_HEAP_UTILIZATION); 即可。

⑵ 請android高手幫忙!

使用照相機的方法:
//在監聽事件中加入如下代碼
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(Environment.getExternalStorageDirectory()+"/","temp.jpg")));
startActivityForResult(intent, reqCode_CAMERA);// reqCode_CAMERA是一個一自己設定的值,用於在onActivityResult方法中判斷是哪一個activity返回的
再重寫onActivityResult方法:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode == reqCode_CAMERA && resultCode== RESULT_OK){
////這里是直接隱式啟動系統圖片預覽程序
// Intent intent = new Intent();
// intent.setAction(Intent.ACTION_VIEW);
//// uri指向用戶選擇的那個圖片
// Uri uri = data.getData();
// intent.setData(uril);
// startActivity(intent);

// Uri uri = data.getData();
// Cursor cursor = getContentResolver().query(uri, null, null, null, null);
// if(cursor!=null&&cursor.moveToFirst()){
// String path = cursor.getString(1);
// Bitmap bm = BitmapFactory.decodeFile(path);
// iv.setImageBitmap(bm);
// }
// iv.setImageURI(uri);

//也可以用這里代碼打開圖片裁剪
Intent intent = new Intent();
intent.setAction("com.android.camera.action.CROP");
intent.setType("image/*");
intent.putExtra("data", data.getExtras().getParcelable("data"));
intent.putExtra("crop", "true");
intent.putExtra("aspectX", 1);//默認圖片剪裁起始位置x值
intent.putExtra("aspectY", 1);//默認圖片剪裁起始位置y值
intent.putExtra("outputX", 128);//默認圖片剪裁終止位置x值
intent.putExtra("outputY", 128);//默認圖片剪裁終止位置x值
intent.putExtra("return-data", true);
startActivityForResult(intent, reqCode_Zoom);

}//這里是處理剪裁圖片返回後的處理,直接調用ImageView顯示了,你可以根據你的需要修改
else if(requestCode==reqCode_Zoom){
Bitmap bitmap = data.getExtras().getParcelable("data");
iv.setImageBitmap(bitmap);
}

上傳本地圖片方法:

按鈕名.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
// 隱式啟動系統相冊程序
Intent intent = new Intent();
intent.setAction(Intent.ACTION_PICK);
intent.setDataAndType(Media.EXTERNAL_CONTENT_URI, "image/*");
startActivityForResult(intent, reqCode_PICK);// reqCode和上面一樣自己定義,但是不要重復了
}
});
再在onActivityResult方法添加一個"elseif(requestCode == reqCode_PICK && resultCode== RESULT_OK)"條件,方法體直接參考上面,就是在剪裁那裡把「intent.putExtra("data", data.getExtras().getParcelable("data"));」換為「intent.setDataAndType(data.getData(), "image/*");」就可以了。

閱讀全文

與androidsetbitmap相關的資料

熱點內容
堅朗內開內倒鋁條演算法 瀏覽:256
華為閱讀新建文件夾 瀏覽:768
幻塔如何選擇伺服器 瀏覽:219
解壓先把文件壓到系統盤 瀏覽:822
access壓縮和修復資料庫 瀏覽:789
光纖交換機命令 瀏覽:511
白色桌放什麼文件夾 瀏覽:292
分治演算法思想 瀏覽:149
s曲線加減速演算法 瀏覽:400
可編程序控制器原理及應用答案 瀏覽:455
小熊編程教程 瀏覽:909
word轉換成pdf轉換器免費下載 瀏覽:609
群體智能基本演算法 瀏覽:371
可編程軟體分為哪兩種 瀏覽:341
格林什麼app可以看 瀏覽:698
飛盧app仙俠熱賣推薦怎麼樣 瀏覽:723
飛秋上傳文件到共享文件夾 瀏覽:692
伺服器的共享文件夾如何訪問 瀏覽:233
復盛螺桿壓縮機講解 瀏覽:333
柱在基礎插筋需要加密嗎 瀏覽:81