Bitmap

335 阅读1分钟

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()