android深入之UI(一)圖片

來源:互聯網
上載者:User

標籤:android   ui   

(一)建立圖片Bitmap的類型

BitmapFactory.Options代表Bitmap儲存的方式

ALPHA_8 只有alpha值,佔1位元組
ARGB_4444 不推薦,ARGB各佔4bits,共佔2位元組
ARGB_8888 預設儲存方式,ARGB各佔8bits,共佔4位元組
RGB_565 沒alpha值,共佔2位元組


(二)Bitmap佔用記憶體大小

Android中一張圖片(BitMap)佔用的記憶體主要和以下幾個因數有關:圖片長度,圖片寬度,單位像素佔用的位元組數。
一張圖片(BitMap)佔用的記憶體=圖片長度*圖片寬度*單位像素佔用的位元組數
註:圖片長度和圖片寬度的單位是像素。

比如一張400*560的圖片,以ARGB_8888顯示,佔用記憶體為400*560*4=869000位元組。

也可以通過程式擷取Bitmap佔用記憶體

protected int bitmapSizeOf(Bitmap data) {        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB_MR1) {            return data.getRowBytes() * data.getHeight();        }        else {            return data.getByteCount();        }    }


(3)Bitmap處理技巧

1.不載入Bitmap擷取圖片資訊

BitmapFactory.Options bmOptions = new BitmapFactory.Options();                bmOptions.inJustDecodeBounds = true;                BitmapFactory.decodeFile(path, bmOptions);                int photoW = bmOptions.outWidth;                int photoH = bmOptions.outHeight;
通過inJustDecodeBounds參數,設定不載入圖片,可以擷取到圖片寬高

2.圖片壓縮處理

InputStream is = this.getResources().openRawResource(R.drawable.pic);BitmapFactory.Options options = new BitmapFactory.Options();options.inJustDecodeBounds = false;options.inSampleSize = 2;Bitmap btp =BitmapFactory.decodeStream(is,null,options);
讀取 drawable 下名為 pic 圖片的縮圖,長度、寬度都只有原圖片的 1/2。圖片大小減少,佔用的記憶體自然也變小了。這麼做的弊端是圖片品質變差,inSampleSize 的值越大,圖片的品質就越差。

3.圖片格式轉換,降低記憶體消耗

BitmapFactory.Options opt = new BitmapFactory.Options();     opt.inPreferredConfig = Bitmap.Config.RGB_565;     opt.inPurgeable = true;     opt.inInputShareable = true;     // 擷取資源圖片     InputStream is = context.getResources().openRawResource(resId);     return BitmapFactory.decodeStream(is,null,opt);  
相比ARGB_8888載入方式,記憶體消耗降低一半。
4.圖片不需要繼續使用即時回收

// 先判斷是否已經回收if(bitmap != null && !bitmap.isRecycled()){         // 回收並且置為null        bitmap.recycle();         bitmap = null; } System.gc();
Bitmap類的構造方法都是私人的,所以開發人員不能直接new出一個Bitmap對象,只能通過BitmapFactory類的各種靜態方法來執行個體化一個Bitmap,產生Bitmap對象最終都是通過JNI調用方式實現的。所以,載入Bitmap到記憶體裡以後,包含兩部分記憶體地區的,一部分是Java部分的,一部分是C部分的。所以需要調用recycle()方法來釋放C部分的記憶體。





android深入之UI(一)圖片

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.