Bitmap 詳細介紹
位圖是我們開發中最常用的資源,畢竟一個漂亮的界麵對用戶是最有吸引力的。
1. 從資源中獲取位圖
可以使用BitmapDrawable或者BitmapFactory來獲取資源中的位圖。
當然,首先需要獲取資源:
Resources res=getResources();
使用BitmapDrawable獲取位圖
1. 使用BitmapDrawable (InputStream is)構造一個BitmapDrawable;
2. 使用BitmapDrawable類的getBitmap()獲取得到位圖;
// 讀取InputStream並得到位圖
Java代碼
InputStream is=res.openRawResource(R.drawable.pic180);
BitmapDrawable bmpDraw=new BitmapDrawable(is);
Bitmap bmp=bmpDraw.getBitmap();
InputStream is=res.openRawResource(R.drawable.pic180);
BitmapDrawable bmpDraw=new BitmapDrawable(is);
Bitmap bmp=bmpDraw.getBitmap();
或者采用下麵的方式:
Java代碼
BitmapDrawable bmpDraw=(BitmapDrawable)res.getDrawable(R.drawable.pic180);
Bitmap bmp=bmpDraw.getBitmap();
BitmapDrawable bmpDraw=(BitmapDrawable)res.getDrawable(R.drawable.pic180);
Bitmap bmp=bmpDraw.getBitmap();
使用BitmapFactory獲取位圖
(Creates Bitmap objects from various sources, including files, streams, and byte-arrays.)
使用BitmapFactory類decodeStream(InputStream is)解碼位圖資源,獲取位圖。
Bitmap bmp=BitmapFactory.decodeResource(res, R.drawable.pic180);
BitmapFactory的所有函數都是static,這個輔助類可以通過資源ID、路徑、文件、數據流等方式來獲取位圖。
以上方法在編程的時候可以自由選擇,在Android SDK中說明可以支持的圖片格式如下:png (preferred), jpg (acceptable), gif (discouraged),和bmp(Android SDK Support Media Format)。
2. 獲取位圖的信息
要獲取位圖信息,比如位圖大小、像素、density、透明度、顏色格式等,獲取得到Bitmap就迎刃而解了,這些信息在Bitmap的手冊中,這裏隻是輔助說明以下2點:
*
在Bitmap中對RGB顏色格式使用Bitmap.Config定義,僅包括ALPHA_8、ARGB_4444、ARGB_8888、RGB_565,缺少了一些其他的,比如說RGB_555,在開發中可能需要注意這個小問題;
*
Bitmap還提供了compress()接口來壓縮圖片,不過AndroidSAK隻支持PNG、JPG格式的壓縮;其他格式的需要Android開發人員自己補充了。
3. 顯示位圖
顯示位圖可以使用核心類Canvas,通過Canvas類的drawBirmap()顯示位圖,或者借助於BitmapDrawable來將Bitmap繪製到Canvas。當然,也可以通過BitmapDrawable將位圖顯示到View中。
轉換為BitmapDrawable對象顯示位圖
// 獲取位圖
Bitmap bmp=BitmapFactory.decodeResource(res, R.drawable.pic180);
// 轉換為BitmapDrawable對象
BitmapDrawable bmpDraw=new BitmapDrawable(bmp);
// 顯示位圖
ImageView iv2 = (ImageView)findViewById(R.id.ImageView02);
iv2.setImageDrawable(bmpDraw);
使用Canvas類顯示位圖
這兒采用一個繼承自View的子類Panel,在子類的OnDraw中顯示
Java代碼
public class MainActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(new Panel(this));
}
class Panel extends View{
public Panel(Context context) {
super(context);
}
public void onDraw(Canvas canvas){
Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.pic180);
canvas.drawColor(Color.BLACK);
canvas.drawBitmap(bmp, 10, 10, null);
}
}
}
public class MainActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(new Panel(this));
}
class Panel extends View{
public Panel(Context context) {
super(context);
}
public void onDraw(Canvas canvas){
Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.pic180);
canvas.drawColor(Color.BLACK);
canvas.drawBitmap(bmp, 10, 10, null);
}
}
}
4. 位圖縮放
(1)將一個位圖按照需求重畫一遍,畫後的位圖就是我們需要的了,與位圖的顯示幾乎一樣:drawBitmap(Bitmap bitmap, Rect src, Rect dst, Paint paint)。
(2)在原有位圖的基礎上,縮放原位圖,創建一個新的位圖:CreateBitmap(Bitmap source, int x, int y, int width, int height, Matrix m, boolean filter)
(3)借助Canvas的scale(float sx, float sy) (Preconcat the current matrix with the specified scale.),不過要注意此時整個畫布都縮放了。
(4)借助Matrix:
Java代碼
Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.pic180);
Matrix matrix=new Matrix();
matrix.postScale(0.2f, 0.2f);
Bitmap dstbmp=Bitmap.createBitmap(bmp,0,0,bmp.getWidth(),
bmp.getHeight(),matrix,true);
canvas.drawColor(Color.BLACK);
canvas.drawBitmap(dstbmp, 10, 10, null);
Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.pic180);
Matrix matrix=new Matrix();
matrix.postScale(0.2f, 0.2f);
Bitmap dstbmp=Bitmap.createBitmap(bmp,0,0,bmp.getWidth(),
bmp.getHeight(),matrix,true);
canvas.drawColor(Color.BLACK);
canvas.drawBitmap(dstbmp, 10, 10, null);
5. 位圖旋轉
同樣,位圖的旋轉也可以借助Matrix或者Canvas來實現。
Java代碼
Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.pic180);
Matrix matrix=new Matrix();
matrix.postScale(0.8f, 0.8f);
matrix.postRotate(45);
Bitmap dstbmp=Bitmap.createBitmap(bmp,0,0,bmp.getWidth(),
bmp.getHeight(),matrix,true);
canvas.drawColor(Color.BLACK);
canvas.drawBitmap(dstbmp, 10, 10, null);
最後更新:2017-04-02 06:51:45