android遊戲開發Bitmap的使用,androidbitmap

來源:互聯網
上載者:User

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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.