關(guān)于Android bitmap你不知道的一些事
本文為大家分享了Android bitmap使用細節(jié),供大家參考,具體內(nèi)容如下
1、計算機表示圖形的幾種方式
1)BMP :幾乎不進行壓縮 占用空間比較大
2)JPG : 在BMP的基礎(chǔ)上對相鄰的像素進行壓縮,占用空間比BMP小
3)PNG : 在JPG的基礎(chǔ)上進一步壓縮 占用空間比較小
這是對三種格式進行一個簡單的介紹,知道是怎么回事就行,在Android中一般都用png格式的圖片,因為他占用空間小
2、圖形的大小
圖形的大小 = 圖片的總像素*每個像素的大小
圖片總像素 = 圖片的長*圖片的高
可以看到 保存一張圖片時有一些選項看一下其中幾個
單色位圖: 每個像素最多可以表示2種顏色,只需要使用長度為1的二進制位來表示,因此每個像素占1/8byte
16色位圖: 每個像素最多可以表示16種顏色,所以只需要長度為4的二進制表示,因此每個像素占1/2byte
256色位圖: 每個像素最多可以表示256中顏色,所以只需要長度是8的二級制位表示就可以了,因此每個像素占1byte
24位位圖:即RGB三原色位圖 每個像素占3個byte。
3、android 加載大圖失敗的原因
知道了上面的知識后,來研究一下android 當中的位圖信息,
在android 中采用ARGB來表示顏色,所以每個像素會占4byte。
當用BitmapFactory加載原圖時當圖片的寬和高遠大于手機的寬和高時會出現(xiàn)
E/AndroidRuntime(2128): Caused by: java.lang.OutOfMemoryError E/dalvikvm-heap(2128): Out of memory on a 30720012-byte allocation.
也就是內(nèi)存越界異常,但是看圖片的大小并沒有超過系統(tǒng)所分給每個應用的內(nèi)存大小。
所以可以確定 加載原圖時圖片的計算方式是按上面的公式計算的。
4、加載大圖的方法
知道了加載大圖失敗的原因后,解決OutOfMemoryError的方法也就很明顯了,對的 就是縮放。
下面就看看下縮放的步驟
1) 獲取手機的寬和高
2)獲取圖片的寬和高
3)計算縮放比
4)按照縮放比顯示圖片
//1) 獲取手機的寬和高 WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE); int screenWidth = wm.getDefaultDisplay().getWidth(); int screenHeight = wm.getDefaultDisplay().getHeight(); //2)獲取圖片的寬和高 BitmapFactory.Options options = new Options(); //返回一個null 沒有bitmap,不去真正解析位圖,但是能返回圖片的一些信息。 options.inJustDecodeBounds = true; BitmapFactory.decodeResource(getResources(), R.drawable.dog,options); int imagWidth = options.outWidth; int imagHeight = options.outHeight; //3)計算縮放比 int scale =1; int scalex = imagWidth / screenWidth; int scaley = imagHeight / screenHeight; scale = Math.max(scalex, scaley); //4)按照縮放比顯示圖片 options.inSampleSize = scale; //開始真正的解析位圖 options.inJustDecodeBounds = false; Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.dog,options);
5、Bitmap修改圖片
在看一種情況,當用BitmapFactory.decodeXXX decode一張圖片后,需要修改圖片
如:
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher); bitmap.setPixel(100, 20, Color.RED);
發(fā)現(xiàn)push到手機后報錯了,這是因為原圖是不能被修改的。
那么當需要修改圖片是怎么辦呢?
對了 可以操作原圖的副本,副本是可以修改的
創(chuàng)建原圖的副本步驟如下:
1)創(chuàng)建模板
2)創(chuàng)建一個畫布以原圖作為模板
3)創(chuàng)建一個畫筆
4)開始拷貝原圖
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher); // bitmap.setPixel(100, 20, Color.RED); // 1)創(chuàng)建模板 Bitmap copybitmap = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), bitmap.getConfig()); // 2)創(chuàng)建一個畫布以原圖作為模板 Canvas canvas = new Canvas(copybitmap); // 3)創(chuàng)建一個畫筆 Paint paint = new Paint(); // 4)開始拷貝原圖 canvas.drawBitmap(bitmap, new Matrix(), paint); // 修改圖片 copybitmap.setPixel(20, 30, Color.RED);
至此是我工作中發(fā)現(xiàn)的一些小的細節(jié),別的一些操作位圖的方法應該都是大家所熟知的了,就不再班門弄斧了。
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
- Android實現(xiàn)圖片壓縮(bitmap的六種壓縮方式)
- Android canvas drawBitmap方法詳解及實例
- android BitmapFactory.Options使用方法詳解
- 解析Android中View轉(zhuǎn)換為Bitmap及getDrawingCache=null的解決方法
- Android Bitmap壓縮方法的選擇詳解
- 利用Android中BitmapShader制作自帶邊框的圓形頭像
- Android自定義view實現(xiàn)圓形、圓角和橢圓圖片(BitmapShader圖形渲染)
- Android讀取本地或網(wǎng)絡(luò)圖片并轉(zhuǎn)換為Bitmap
- Android把Bitmap保存為PNG圖像文件的簡單代碼
相關(guān)文章
android JSON解析數(shù)據(jù) android解析天氣預報
這篇文章主要為大家詳細介紹了android JSON解析數(shù)據(jù),android天氣預報JSON數(shù)據(jù)解析,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-03-03Android webview與js的數(shù)據(jù)交互
有了WebView這個組件,Android應用開發(fā)技術(shù)也就轉(zhuǎn)嫁到html與java數(shù)據(jù)交互上來。說白了就是js與WebView的數(shù)據(jù)交互,這就是本文所要討論的2017-04-04月下載量上千次Android實現(xiàn)二維碼生成器app源碼分享
既然是二維碼生成器那么我們?nèi)绾沃谱鞫S碼呢?這篇文章為大家分享了月下載量上千次Android實現(xiàn)二維碼生成器app源碼,希望大家喜歡2015-12-12Android調(diào)用系統(tǒng)的發(fā)郵件功能的小例子
這篇文章介紹了Android調(diào)用系統(tǒng)的發(fā)郵件功能的小例子,有需要的朋友可以參考一下2013-08-08用Android Studio3.0新功能加快構(gòu)建速度
本文主要介紹了使用Android Studio3.0新功能,加快Android Studio的構(gòu)建速度等相關(guān)做法。2017-11-11Android筆記之:onConfigurationChanged詳解
本篇是對Android中onConfigurationChanged的使用進行了詳細的分析介紹。需要的朋友參考下2013-05-05