Android Bitmap的一点研究


android中的Bitmap与其他对象不同,不能通过new Bitmap()直接实例化.

查看源码,Bitmap的构造函数是default的,仅包内可见,实际是供native方法调用的。

Bitmap中实际保存数据的地方在native层,java层仅对native层方法进行封装、重载,

并提供一些状态的判断方法、属性的setget方法。

BitmapmNativaBitmap属性,用来保存nativeBitmap的地址。

mNativeBitmap的地址在构造Bitmap时,由native方法直接传递进来。

####所以整个Bitmap可以认为在java层基本不怎么占内存,大部分内存占用都是在native层。

Bitmap自身提供了三类创建Bitmap的静态方法:

1. 根据传入的colors数组,生成bitmapcolors数组就是每个像素点的颜色值ARGB

createBitmap(int colors[], int offset, int stride, int width, int height, Config config);

最终调用native方法

nativeCreate(int[] colors, int offset, int stride, int width. int height, int config.nativeInt, boolean false)

生成新的Bitmap

2. 生成指定大小的空白Bitmap

createBitmap(int width, int height, Config config)

同样最终会调用

nativeCreate(int[] colors, int offset, int stride, int width. int height, int config.nativeInt, boolean false)

不过其中color数组为null

3. 从源Bitmap中截取一部分,生成新的Bitmap,不对源bitmap修改

具体实现分两部分:

调用方法(2)生成新的空白bitmap

new 一个Canvas,将新生成的bitmap set到canvas里,通过canvas对bitmap进行裁剪等处理,然后返回bitmap

Canvas canvas = new Canvas();
canvas.setBitmap(bitmap);
canvas.drawBitmap(sourceBitmap, srcRect, dstRectF, paint);
canvas.setBitmap(null);  //将临时的canvas中的mBitmap置空,防止canvas拥有bitmap引用,无法被GC回收

文章作者: Caden
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Caden !
 上一篇
Drawable小研究 Drawable小研究
Drawable,官方给出的解释是“something that can be drawn”,翻译过来就是可以被画的东西。 官方把“可以被画的东西”分为了7种形式: Bitmap 最简单的“可以被画的东西”,可能是png,或jpg Ni
2014-04-13
下一篇 
如何在android上抓包 如何在android上抓包
用Charlesandroid4.0以上的系统,wifi环境下支持设置网络代理。 安装Charles 打开Charles,在proxy–>proxy settings–>proxies中设置要监听的端口号,一般为8080
2014-03-21
  目录