android中的Bitmap与其他对象不同,不能通过new Bitmap()
直接实例化.
查看源码,Bitmap的构造函数是default的,仅包内可见,实际是供native方法调用的。
Bitmap中实际保存数据的地方在native层,java层仅对native层方法进行封装、重载,
并提供一些状态的判断方法、属性的set
、get
方法。
Bitmap有mNativaBitmap
属性,用来保存nativeBitmap
的地址。
mNativeBitmap
的地址在构造Bitmap时,由native方法直接传递进来。
####所以整个Bitmap可以认为在java层基本不怎么占内存,大部分内存占用都是在native层。
Bitmap自身提供了三类创建Bitmap的静态方法:
1. 根据传入的colors
数组,生成bitmap
,colors
数组就是每个像素点的颜色值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回收