Android ApiDemos示例解析(56):Graphics->BitmapPixels

android.nio 包中定義裡Buffer和類型相關的子類:

 

Buffer類功能類似於數組,它定義瞭一些用於管理和服務數組中元素的方法。

Bitmap類中定義的方法public void copyPixelsFromBuffer(Buffer src)和 public void copyPixelsToBuffer(Buffer dst) 可以用來實現Bitmap 的像素數組與Buffer直接的數據交換。和Bitmap的public void getPixels(int[] pixels, …)和public void setPixels(int[] pixels, …)不同的是,使用Buffer於Bitmap進行數據交換時,buffer中的數據不會有變化,而是要setPixels ,getPixels 的int[] pixels會自動根據Bitmap 當前的配置(ARGB_8888,RGB_565,ARGB_4444)有所轉換,這是因為int[] pixels格式總是ARGB_8888格式。

而在使用Buffer時,可以選用IntBuffer (ARGB_8888) ,ShortBuffer(RGB_565,ARGB_4444)對應不同的Bitmap配置。

本例BitmapPixels 介紹瞭如和使用IntBuffer,ShortBuffer來直接修改Buffer中Pixel值(不通過Canvas的繪圖命令),然後再將Buffer中的值拷貝到Bitmap中。

例子中使用瞭三種不同的Bitmap配置:

IntBuffer <–>ARGB_8888
ShortBuffer < –> RGB_565
ShortBuffer < –> RGB_444
[java] view plaincopyprint?
int[] data8888 = new int[N];  
short[] data565 = new short[N];  
short[] data4444 = new short[N];  
   
makeRamp(premultiplyColor(Color.RED), premultiplyColor(Color.GREEN),  
 N, data8888, data565, data4444); 
int[] data8888 = new int[N];
short[] data565 = new short[N];
short[] data4444 = new short[N];
 
makeRamp(premultiplyColor(Color.RED), premultiplyColor(Color.GREEN),
 N, data8888, data565, data4444);

 

數組data8888,data565,data4444各自定義裡三種Bitmap配置中的一行Pixels值,makeRamp為每行生成從紅色到綠色的顏色漸變中間值。

makeBuffer(data8888, N) 則根據這一行的顏色漸變復制N行(最終生成一個正方形)。

[java] 
IntBuffer dst = IntBuffer.allocate(n*n);  
for (int i = 0; i < n; i++) {  
 dst.put(src);  
}  
dst.rewind();  
return dst; 
IntBuffer dst = IntBuffer.allocate(n*n);
for (int i = 0; i < n; i++) {
 dst.put(src);
}
dst.rewind();
return dst;

 

作者:mapdigit
 

 

發佈留言