Android位元影像總結

來源:互聯網
上載者:User

由於項目中牽扯到了對位元影像(android.graphics.Bitmap)的操作,於是對照Android的參考文檔詳細地研究了一下Android提供的位元影像相關功能。
一、對位元影像的擷取
在Android的SDK中提供了一個BitmapFactory 類。採用此類的幾個方法能夠從一個檔案路徑或者輸入資料流中得到位元影像。
包:android.graphics
類:BitmapFactory
Android SDK中的簡介:Creates Bitmap objects from various sources, including files, streams, and byte-arrays.
此類其提供了以下方法來擷取Bitmap,這些方法都是靜態:
1、decodeByteArray(byte[] data, int offset, int length)從一個位元組數組中得到資料轉換為位元影像。
2、decodeFile(String pathName)由一個影像檔路徑的得到位元影像(支援jpg、png、bmp格式)
3、decodeFileDescriptor(FileDescriptor fd)由一個檔案描述符得到位元影像。
4、decodeResource(Resources res, int id)由資源ID擷取位元影像
5、decodeStream(InputStream is)由圖片輸入資料流擷取位元影像。
這裡,由於Android系統本身對apk程式的限制,當載入大圖片時會產生OutOfMemoryError。可以採取兩種辦法解決:
先使用android.provider.MediaStore.Images.Media類的query(ContentResolver cr, Uri uri, String[] projection, String where, String orderBy)方法獲得對應的圖片所對應的id,然後使用android.provider.MediaStore.Images.Thumbnails類的queryMiniThumbnail(ContentResolver cr, long origId, int kind, String[] projection)獲得圖片對應的縮圖的路徑,再使用BitmapFactory的decodeFile(String
pathname)擷取到圖片的縮圖,這樣即可避免記憶體溢出的發生。
採取壓縮圖片的方法對圖片進行壓縮。這裡主要還是使用BitmapFactory類,對於上面提到過的能夠擷取位元影像的幾個方法,都對應著另一個多了一個參數的方法,例如decodeFile(String pathName)對應著decodeFile(String pathName, BitmapFactory.Options opts)這個方法,其他的可查閱參考文檔。其中,通過引入opts這個參數,對其進行相關的設定,最後能得到一個被壓縮的圖片。
二、對位元影像資訊的擷取
要擷取位元影像資訊,比如位元影像大小、是否包含透明度、顏色格式等,擷取得到Bitmap就迎刃而解了,這些資訊在Bitmap的函數中可以輕鬆擷取到。Android SDK中對Bitmap有詳細說明,這裡輔助說明以下2點:
1、在Bitmap中對RGB顏色格式使用Bitmap.Config定義,僅包括ALPHA_8、ARGB_4444、ARGB_8888、RGB_565,缺少了一些其他的,比如說RGB_555,在開發中可能需要注意這個小問題;
2、Bitmap還提供了compress()介面來壓縮圖片,不過Android SDK只支援PNG、JPG格式的壓縮;其他格式的需要Android開發人員自己補充了。
三、位元影像的顯示
位元影像的顯示,一般可以在介面中放置ImageView控制項,然後調用android.widget.ImageView類的setImageBitmap(Bitmap bm)方法將位元影像顯示出來。另外,可以使用核心類android.graphics.Canvas的drawBirmap()方法顯示位元影像,或者藉助於BitmapDrawable來將Bitmap繪製到Canvas。
四、位元影像的縮放
位元影像的縮放,在Android SDK中提供了2種方法:
1、將一個位元影像按照需求重畫一遍,畫後的位元影像就是我們需要的了,與位元影像的顯示幾乎一樣:drawBitmap(Bitmap bitmap, Rect src, Rect dst, Paint paint)
在原有位元影像的基礎上,縮放原位元影像,建立一個新的位元影像: createBitmap(Bitmap source, int x, int y, int width, int height, Matrix m, boolean filter)
歸結到底,位元影像縮放的本質就是將原始位元影像按照需求顯示出來,創造一張新的位元影像。
五、位元影像的旋轉
位元影像的旋轉,離不開Matrix。Matrix線上性代數中都學習過,Android SDK提供了Matrix類,可以通過各種介面來設定矩陣。例子如下“
Matrix matrix = new Matrix();matrix.setRotate(90,120,130);canvas.drawBitmap(mbmpTest, matrix, mPaint);
除了這種方法之外,我們也可以在使用Bitmap提供的函數如下:public static Bitmap createBitmap (Bitmap source, int x, int y, int width, int height, Matrix m, boolean filter)
在原有位元影像旋轉的基礎上,建立新位元影像。
六、位元影像的截取
對於位元影像的規則形狀如矩形的截取,很容易通過Matrix進行實現。例子如下:
Bitmap croppedImage;
// 取得裁剪的矩形
Rect r = mCrop.getCropRect();
if(r == null) return;
int width = r.width();
int height = r.height();
// 產生裁剪的圖片
croppedImage = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);
Canvas canvas = new Canvas(croppedImage);
Rect dstRect = new Rect(0, 0, width, height);
canvas.drawBitmap(mBitmap, r, dstRect, null);
而對於位元影像的不規則形狀的截取,找不到很好的解決辦法。曾想過直接對像素進行操作,最終因為演算法的的複雜而放棄。一次偶然的機會,在閱讀一篇博文時,我發現了使用android.graphics.Canvas的clipPath方法不僅僅可以達到高亮顯示路徑的目的,也能夠達到任意形狀截取圖片的目的,從而解決了此問題。
以上就是對Android的位元影像功能進行的總結,以及一些自己實踐中得出的想法和結論。更深入的內容需要仔細地去閱讀研究Android SDK文檔並付之於實踐

相關文章

聯繫我們

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