1.是什么?
定义
位图,是一种存储像素的数据结构,通过这个对象我们可以获取到一系列和图片相关的属性,并且 可以对图像进行处理,比如切割,放大等等,相关操作。
结构
像素
+ 描述信息
- 像素 Android 3.x ~ 7.x 期间。
private byte[] mBuffer;
Android 8.x 之后。
// Convenience for JNI access
@UnsupportedAppUsage
private final long mNatevePtr;
- 描述信息
主要包括
Bitmap.config
、宽
、高
、分辨率
等。
存储
- Android 3.x ~ 7.x 期间
Bitmap的像素存储在Dalvik的Java堆上。
- Android 8.x 之后
Bitmap的像素存储在native上。
2.为什么?
Bitmap内存是如何分配的?
- Android 3.x ~ 7.x 期间
sequenceDiagram
Bitmap.java->>Bitmap.java: createBitmap(int width,int height,...)
Bitmap.java->>Bitmap.java: createBitmap(DisplayMetrics display,...)
Bitmap.java->>Bitmap.cpp:nativeCreate
Bitmap.cpp->>GraphicsJNI:Bitmap_creator()
GraphicsJNI->>JNIEnv:allocateJavaPixelRef()
JNIEnv->>JNIEnv:CallObjectMethod()//在java层创建像素存储
GraphicsJNI->>GraphicsJNI:crateBitmap()
- Android 8.x 之后
sequenceDiagram
Bitmap.java->>Bitmap.java: createBitmap(int width,int height,...)
Bitmap.java->>Bitmap.java: createBitmap(DisplayMetrics display,...)
Bitmap.java->>Bitmap.cpp:nativeCreate
Bitmap.cpp->>Bitmap.cpp:Bitmap_creator()
Bitmap.cpp->>Bitmap.cpp:allocateHeapBitmap()
Bitmap.cpp->>linux:allocateBitmap()
linux->>linux:calloc//在native层创建像素存储
Bitmap为什么会造成OOM?
- Android 3.x ~ 7.x 期间
Java 虚拟机堆内存空间不足。
- Android 8.x 之后
Native( linux) 内存不足。
Bitmap怎样回收?
- Android 3.x ~ 7.x 期间
走 GC 回收路线。
- Android 8.x 之后
走 GC 回收路线 java层通过 NativeAllocationRegistry 回收 Native 内存。
3.怎么用?
创建方式
Bitmap.create
Bitmap.createAshmemBitmap
Bitmap.createScaledBitmap
BitmapFactory.decodeXXX
常用API
拷贝
Bitmap.copy
Bitmap.copyPixelsToBuffer
Bitmap.copyPixelsFromBuffer
压缩
Bitmap.compress
Bitmap.CompressFormat
读写Bitmap的像素数组
getPixel
getPixels
setPixel
setPixels
获取大小
getRowBytes()
getByteCount()
getAllocationByteCount()