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
补充:移动开发 , Android ,