1. 程式人生 > >Android常用的Drawable和Bitmap之間的轉化方法

Android常用的Drawable和Bitmap之間的轉化方法

bitmap和Drawable間的區別:

Bitmap - 稱作點陣圖,一般點陣圖的檔案格式字尾為bmp,當然編碼器也有很多如RGB565、RGB888。作為一種逐畫素的顯示物件執行效率高,但是缺點也很明視訊記憶體儲效率低。我們理解為一種儲存物件比較好。
 Drawable - 作為Android平下通用的圖形物件,它可以裝載常用格式的影象,比如GIF、PNG、JPG,當然也支援BMP,當然還提供一些高階的視覺化物件,比如漸變、圖形等。
兩者間的簡單對比:


Drawable在記憶體佔用和繪製速度這兩個非常關鍵的點上勝過Bitmap;

我們經常會遇到需要在程式碼中獲取資原始檔下圖片的問題:

Bitmap    bmp = BitmapFactory.decodeResource(getResources(),R.drawable.ic );

或者:

Drawable drawable = getResources().getDrawable(R.drawable.ic);
或者:
iv.setImageResource(R.drawable.ic_launcher);

獲取路徑下的圖片資源:

String fileName = "/data/data/com.test/aa.png; 
Bitmap bm = BitmapFactory.decodeFile(fileName); 
iv.setImageBitmap(bm); //佔用記憶體

下面來看看兩者間的轉換:

Drawable   ----->Bitmap:

第一種:

BitmapDrawable bd = (BitmapDrawable) drawable;
Bitmap bm= bd.getBitmap();

第二種:

public static Bitmap drawableToBitmap(Drawable drawable) {   
        // 取 drawable 的長寬   
        int w = drawable.getIntrinsicWidth();   
        int h = drawable.getIntrinsicHeight();   
   
        // 取 drawable 的顏色格式   
        Bitmap.Config config = drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888   
                : Bitmap.Config.RGB_565;   
        // 建立對應 bitmap   
        Bitmap bitmap = Bitmap.createBitmap(w, h, config);   
        // 建立對應 bitmap 的畫布   
        Canvas canvas = new Canvas(bitmap);   
        drawable.setBounds(0, 0, w, h);   
        // 把 drawable 內容畫到畫布中   
        drawable.draw(canvas);   
        return bitmap;   
    }   

Bitmap--------> Drawable:
第一種:

Drawable drawable = new BitmapDrawable(bitmap); 

第二種:

BitmapDrawable bd= new BitmapDrawable(getResource(), bm);    

BitmapDrawable是Drawable的子類,可以直接使用;


對於圖片壓縮和儲存的知識點: