public void getPixels(int[] pixels, int offset, int stride,int x, int y, int width, int height) 數組
獲取原Bitmap的像素值存儲到pixels數組中。 ide
參數: spa
pixels 接收位圖顏色值的數組 索引
offset 寫入到pixels[]中的第一個像素索引值 ci
stride pixels[]中的行間距個數值(必須大於等於位圖寬度)。不能爲負數 get
x 從位圖中讀取的第一個像素的x座標值。 it
y 從位圖中讀取的第一個像素的y座標值 table
width 從每一行中讀取的像素寬度 import
height 讀取的行數 stream
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
@Override
public Bitmap process(Bitmap bitmap) {
// TODO Auto-generated method stub
Bitmap destImage = Bitmap.createBitmap(400,
400, Config.ARGB_8888);
int width = destImage.getWidth();
int height = destImage.getHeight();
for(int i = 0; i < width/2; i++){
for(int j = 0; j < height/2; j++){
destImage.setPixel(i, j, Color.RED);//左上區域紅色
}
for(int j = height / 2; j < height; j++){
destImage.setPixel(i, j, Color.CYAN);//左下區域青色
}
}
for(int i = width / 2; i < width; i++){
for(int j = 0; j < height/2; j++){
destImage.setPixel(i, j, Color.YELLOW);//右上區域黃色
}
for(int j = height / 2; j < height; j++){
destImage.setPixel(i, j, Color.BLACK);//右下區域黑色
}
}//上述代碼肯定了原圖destImage的全部像素值
int[] mPixels = new int[width * height];
for(int i = 0; i < mPixels.length; i++){
mPixels[i] = Color.BLUE;//數組中默認值爲藍色
}
destImage.getPixels(mPixels, 0, width, 0, 0,
width, height);
Bitmap mResultBitmap = Bitmap.createBitmap(mPixels, 0, width, width, height,
Bitmap.Config.ARGB_8888);
return mResultBitmap;
}
|
原始destImage爲四色的。
提取紅色區域:
destImage.getPixels(mPixels, 0, width, 0, 0, width/2, height/2);
提取黃色區域:
destImage.getPixels(mPixels, 0, width, width/2, 0, width/2, height/2);
提取青色區域:
destImage.getPixels(mPixels, 0, width, 0, height/2, width/2, height/2);
提取黑色區域:
destImage.getPixels(mPixels, 0, width, width/2, height/2, width/2, height/2);
從上面四個操做能夠理解了x,y,width,height四個參數是如何控制提取原圖哪塊區域位置的元素的。上面這些有兩點須要說明:
1. 剩餘的區域並非透明的或空白的,由於mPixels數組的默認值爲藍色,且新生成的bitmap的寬高值也是按原圖大小設定的。若是隻須要提取以後的圖,那麼只須要設置mPixels數組大小爲提取的區域的像素數目,新生成的bitmap寬高依照提取區域設置便可。
2. 全部提取的區域都在新圖的左上角。這是由於提取的區域在mPixels中是從0位置存儲的。也就是新圖徹底由提取以後的mPixels數組決定。offset參數則決定了新提取的元素存儲在mPixels數組中的起始位置。這一點須要明白提取像素是一行一行的存儲到mPixels數組中的。因此有以下結果:
提取區域在新圖區域左上角:offset = 0;
提取區域在新圖區域右上角:offset = width/2;
提取區域在新圖區域左下角:offset = width * (height / 2);
提取區域在新圖區域右下角:offset = width * (height / 2) + width / 2;
上面的這四個賦值同時也說明了提取的元素在mPixels這一二維數組中是呈塊狀區域存儲的,用二維圖來看比較清晰。咱們只須要設定起始的元素的存儲位置offset便可。
stride是什麼意思呢?它的值必須大於等於原圖的寬。經過實際應用來理解它:把兩張上述的四色圖拼接到一塊兒
1
2
3
4
5
6
7
|
destImage.getPixels(mPixels, 0 , 2 * width, 0, 0,
width, height);
destImage.getPixels(mPixels, width , 2 * width, 0, 0,
width, height);
Bitmap mResultBitmap = Bitmap.createBitmap(mPixels, 0, width * 2, width * 2, height * 2,
Bitmap.Config.ARGB_8888);
|
createBitmap和getPixels中的stride參數的意義是同樣的,正是經過這一參數實現瞭如何把塊狀區域在二維數組mPixels中也是塊狀區域的。
這個參數的意義是行間距,也即一行讀取完畢後,下一行應該間隔多少讀取,數組應該間隔多少纔開始存儲下一行數據。