Android ApiDemos示例解析(56):Graphics->BitmapPixels
来源:互联网 发布:为什么域名要有别名 编辑:程序博客网 时间:2024/06/01 08:34
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
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行(最终生成一个正方形)。
IntBuffer dst = IntBuffer.allocate(n*n);
for
(
int
i =
0
; i < n; i++) {
dst.put(src);
}
dst.rewind();
return
dst;
此外代码中生成渐变颜色的算法中提到了premultiplied color,可以参见http://www.teamten.com/lawrence/graphics/premultiplication/
如果你想自己实现底层图形算法,可以考虑使用Buffer。将Buffer当成画板,绘图算法直接操作Buffer中像素的值,最后通过copyPixelsFromBuffer 将Buffer中内容显示出来。引路蜂二维图形库就是使用了类似的机制
- Android ApiDemos示例解析(56):Graphics->BitmapPixels
- Android ApiDemos示例解析(56):Graphics->BitmapPixels
- Android ApiDemos示例解析(77):Graphics->RoundRects
- Android ApiDemos示例解析:Graphics->Layers
- Android ApiDemos示例解析(55):Graphics->BitmapMesh
- Android ApiDemos示例解析:Graphics->Layers
- Android ApiDemos示例解析(51):Graphics->AlphaBitmap
- Android ApiDemos示例解析(52):Graphics->AnimateDrawables
- Android ApiDemos示例解析(53):Graphics->Arcs
- Android ApiDemos示例解析(54):Graphics->BitmapDecode
- Android ApiDemos示例解析(55):Graphics->BitmapMesh
- Android ApiDemos示例解析(57):Graphics->CameraPreview
- Android ApiDemos示例解析(58):Graphics->Clipping
- Android ApiDemos示例解析(59):Graphics->ColorFilters
- Android ApiDemos示例解析(60):Graphics->ColorMatrix
- Android ApiDemos示例解析(61):Graphics->Compass
- Android ApiDemos示例解析(62):Graphics->CreateBitmap
- Android ApiDemos示例解析(63):Graphics->Density
- Eclipse必备常识
- ActionScript3.0中往Array数组中插入值
- [Internet]12个国外免费DNS服务
- 在main函数之前调用函数,以及对设计的作用
- QT的核心-----signals & slots
- Android ApiDemos示例解析(56):Graphics->BitmapPixels
- (学习记)Adroid 模拟器输入中文!
- define(宏)中#和##的用法
- 关于C++ Qt
- 浪潮实习8.16
- 在 AIX 上实现 Java: 下载、安装和配置
- (连载)一步一步教你做黑白棋游戏(一)
- sql创建临时表或视图增加 自增列
- AIX 上的 Java 故障诊断:AIX 核心转储