1. 程式人生 > >Android中的圖形影象相關(多媒體1)

Android中的圖形影象相關(多媒體1)

多媒體:(包含文字 圖片 音訊 視訊)

一、  計算機表示圖形的幾種方式

 圖形的大小 = 圖片的總畫素 * 每個畫素的大小

JPG格式:它用有失真壓縮方式去除冗餘的影象和彩色資料,獲取得極高的壓縮率的同時能展現十分豐富生動的影象,換句話說,就是可以用最少的磁碟空間得到較好的影象質量。

PNG格式:PNG是目前保證最不失真的格式,它汲取了GIF和JPG二者的優點,存貯形式豐富,PNG的缺點是不支援動畫應用效果。 Android採用的是png格式。

GIF 格式:GIF是英文Graphics Interchange Format(圖形交換格式)的縮寫。顧名思義,這種格式是用來交換圖片的。GIF格式的特點是壓縮比高,磁碟空間佔用較少。

BMP格式:BMP是英文Bitmap(點陣圖)的簡寫,它是Windows作業系統中的標準影象檔案格式,這種格式的特點是包含的影象資訊較豐富,幾乎不進行壓縮,但由此導致了它與生俱生來的缺點--佔用磁碟空間過大。

其中BMP有如下儲存方式:

單色 :每個畫素最多可以表示2種顏色 ,只需要使用長度為1的二進位制位來表示 ,那麼每個畫素佔1/8byte 

16色 :每個畫素最多可以表示16種顏色 0000 - 1111,那麼只需要使用長度為4的二進位制表示,那麼每個畫素佔1/2個byte

256色:每個畫素最多可以表示256種顏色  0000 0000 - 1111 1111 ,那麼只需要使用長度8的二進位制位表示,那麼每個畫素佔1byte 

24位:rgb ,紅(R)、綠(G)、藍(B),其中:r 1byte   0-255 

g 1byte  0-255

b 1byte  0-255     那麼一個畫素佔3byte 

注意:在Android中每個畫素由ARGB來表示,在RGB基礎上給你增加了Alpha(透明度)通道,因此每個畫素佔4byte。

二、Android中縮放載入大圖片

①提出問題

當單張圖片解析度大於手機螢幕解析度時,若載入圖片會失敗,產生如下bug:

 E/AndroidRuntime(2128): Caused by: java.lang.OutOfMemoryError            //記憶體溢位,記憶體是與手機螢幕的大小有關

E/dalvikvm-heap(2128): Out of memory on a 30720012-byte allocation.
為了解決上述問題,我們只能通過縮放圖片,因此剩下的問題就是我們應該按什麼比例縮小圖片。 例如:圖片:2400*3200                       手機:320*480 通過計算寬縮放:7       高縮放:6       因此我們選擇整體縮放7

②解決問題

實現步驟:1.獲取手機的解析度(寬和高) WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);
screenWidth = wm.getDefaultDisplay().getWidth();
screenHeight = wm.getDefaultDisplay().getHeight();
2.獲取圖片的解析度 // 建立bitmap工廠的配置引數
BitmapFactory.Options options = new Options();
options.inJustDecodeBounds = true;
//true表示: 返回一個null 沒有bitmap 不去真正的解析點陣圖 但是能返回圖片的一些資訊(寬和高)
Bitmap decodeFile = BitmapFactory.decodeFile("/mnt/sdcard/dog.jpg", options);
// 獲取圖片的寬和高
int imageWidth = options.outWidth;
int imageHight = options.outHeight;
3.計算縮放比 4.按照縮放比顯示圖片 //5、按照縮放比顯示圖片
options.inSampleSize=scale;//第4步計算的縮放比
//6.開始真正的解析點陣圖
options.inJustDecodeBounds=false;
Bitmap bitmap = BitmapFactory.decodeFile("/mnt/sdcard/dog.jpg", options);

三、建立原圖的副本

①提出問題

為了操作圖片(作畫,旋轉,平移,縮放等),由於直接載入的圖片時原圖不能進行操作,不能被修改。於是為了解決這個問題,就提出了拷貝原圖得到副本,我們就可以操作副本了。

②解決問題(直接上程式碼)

//3.拷貝原圖
//1.建立模板  srcBitmap是得到的原圖。copyBitmap 是拷貝的副本
Bitmap copyBitmap = Bitmap.createBitmap(srcBitmap.getWidth(), srcBitmap.getHeight(), srcBitmap.getConfig());
//2.想作畫需要一個畫布 以copeBitmap為模板
Canvas canvas=new Canvas(copyBitmap);
//3.建立一個畫筆
Paint paint = new Paint();
//開始作畫   srcBitmap參考原圖去畫   matrix 矩陣 paint 畫筆
canvas.drawBitmap(srcBitmap, new Matrix(), paint);

四、圖形的處理

在Android中,對圖片的處理需要使用到Matrix類,Matrix是一個3 x 3的矩陣,他對圖片的處理分為以下四個基本型別: ①旋轉變換(Rotate) ②縮放變換(Scale) ③位移變換(Translate) ④錯切變換(Skew) 其中,在Android的API裡對於每一種變換都提供了三種操作方式:set(用於設定Matrix中的值)、post(後乘,根據矩陣的原理,相當於左乘)、pre(先乘,相當於矩陣中的右乘) 例如:倒影效果 matrix.setScale(1.0f,-1.0f); //post是在上次修改的基礎上進行修改,set 是每次都是在最初的基礎上修改,會覆蓋上一次的修改
//matrix.setTranslate(0, srcBitmap.getHeight());//錯誤
matrix.postTranslate(0, srcBitmap.getHeight());
例如:鏡面效果 matrix.setScale(-1.0f, 1.0f); matrix.postTranslate(srcBitmap.getWidth(), 0);

五、總結

Android中畫素是以ARGB來表示,其中圖形大小=畫素個數*每個畫素大小。載入大圖片時怎麼解決。作圖時我們需要畫布(Canvas),畫筆(Paint)。圖形處理使用Matrix,重點記住set與post的區別。