android遊戲開發Bitmap的使用,androidbitmap
Bitmap是Android系統中的影像處理的最重要的類之一。
用Bitmap可以擷取影像檔資訊,對映像進行旋轉,剪下,放大,縮小等操作。
在Android SDK中可以支援的圖片格式如下:png , jpg , gif和bmp。
一 建立
1 從資源中擷取位元影像
1.1 使用BitmapDrawable擷取位元影像
a 使用BitmapDrawable (InputStream is)構造一個BitmapDrawable;
b 使用BitmapDrawable類的getBitmap()擷取得到位元影像;
// 讀取InputStream並得到位元影像InputStream is = res.openRawResource(R.drawable.pic180);BitmapDrawable bmpDraw = new BitmapDrawable(is);Bitmap bmp = bmpDraw.getBitmap();或者BitmapDrawable bmpDraw=(BitmapDrawable)res.getDrawable(R.drawable.pic180);Bitmap bmp=bmpDraw.getBitmap();
1.2 使用BitmapFactory擷取位元影像
BitmapFactory的所有函數都是static,這個輔助類可以通過資源ID、路徑、檔案、資料流等方式來擷取位元影像。
decodeByteArray(byte[] data, int offset,int length)從指定位元組數組的offset位置開始,將長度為length的位元組資料解析成Bitmap對象。
decodeFIle(String pathName)從pathName指定的檔案中解析、建立Bitmap對象。
decodeFileDescriptor(FileDescriptor fd)用於從FileDescriptor對應的檔案中解析、建立Bitmap對象。
decodeResource(Resource res,int id)用於根據給定的資源ID從指定的資源檔中解析、建立Bitmap對象。
decodeStream(InputStream is)用於從指定輸入資料流中介解析、建立Bitmap對象。
例如:
Bitmap bmp = BitmapFactory.decodeResource(res, R.drawable.pic180);
在系統不斷的解析、建立Bitmap的過程中,可能會由於記憶體小或其他原因,導致程式運行時發生OutOfMemory錯誤。
為此,Android為Bitmap提供了記憶體回收方法:
void recycle();強制回收Bitmap對象。
boolean isRecycle();判斷Bitmap 對象是否被回收的方法:
二 擷取位元影像的資訊
public final int getWidth()擷取位元影像的寬度
public final int getHeight()擷取位元影像的高度
public final boolean isMutable()圖片是否可修改
public int getScaledWidth(Canvas canvas)擷取指定密度轉換後的映像的寬度
public int getScaledHeight(Canvas canvas)擷取指定密度轉換後的映像的高度
public boolean compress(CompressFormat format, int quality, OutputStream stream)——按指定的圖片格式以及畫質,將圖片轉換為輸出資料流。
format:Bitmap.CompressFormat.PNG或Bitmap.CompressFormat.JPEG
quality:畫質,0-100.0表示最低畫質壓縮,100以最高畫質壓縮。對於PNG等無損格式的圖片,會忽略此項設定。
另外補充兩點:
在Bitmap中對RGB顏色格式使用Bitmap.Config定義,僅包括ALPHA_8、ARGB_4444、ARGB_8888、RGB_565,缺少了一些其他的,比如說RGB_555,在開發中可能需要注意這個小問題;
Bitmap還提供了compress()介面來壓縮圖片,不過AndroidSAK只支援PNG、JPG格式的壓縮;其他格式的需要Android開發人員自己補充了。
三 顯示位元影像
顯示位元影像可以使用核心類Canvas,通過Canvas類的drawBirmap()顯示位元影像。
或者藉助於BitmapDrawable來將Bitmap繪製到Canvas。
當然,也可以通過BitmapDrawable將位元影像顯示到View中。
1 轉換為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);
2 使用Canvas類顯示位元影像
public void onDraw(Canvas canvas){ Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.pic180);canvas.drawColor(Color.BLACK);canvas.drawBitmap(bmp, 10, 10, null);}
四 位元影像縮放
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:
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);
五 位元影像旋轉
同樣,位元影像的旋轉也可以藉助Matrix或者Canvas來實現。
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);
參考文章:
http://www.cnblogs.com/feisky/archive/2010/01/10/1643460.html
http://blog.csdn.net/csxwc/article/details/10345235
http://coollast.blog.51cto.com/6319475/1120760