Bitmap 简介

Bitmap 简介

Drawable, Canvas和 Bitmap区别

  • Drawable: 通用的图像对象, 用于装载常用格式的图像,如PNG、JPG、GIF等;

  • Canvas: 画布,可绘制的区域。提供drawXXX()等方法将Text、Bitmap图形绘制到画布上;

  • Bitmap: 一种存储像素的数据结构, 通过这个对象可得到一系列的图像属性. 可对图像进行旋转, 切割, 放大, 缩小等操作. 可将Bitmap渲染到Canvas获取新的Bitmap.

Bitmap

  1. Bitmap的创建
// 从源Bitmap获取immutable的Bitmap  
createBitmap(Bitmap src);  
// 从源Bitmap中(x, y)处指定width、height创建新immutable Bitmap  
createBitmap(Bitmap src, int x, int y, int width, int height,);  
// 返回经过matrix变换的immutable Bitmap.  
createBitmap(Bitmap src, int x, int y, int width, int height, Matrix m, boolean filter);

// 返回具有指定width和height的mutable bitmap.  
createBitmap(int width, int height, Config config);  
// density:可以理解为相对屏幕密度, 1个DIP在160dpi的屏幕上大约为1像素大小. 以160dpi为基准线, density的值即为相对于160dpi屏幕的相对屏幕密度. 比如, 160dpi屏幕的density值为1, 320dpi屏幕的density值为2.   
createBitmap(DisplayMetrics display, int width, int height, Config config);
// 若bitmap是ARGB_8888或RGBA_16F, hasAlpha可将bitmap标记为不透明.   
createBitmap(int width, int height, Confit config, boolean hasAlpha);
// @param colorSpace: The color of the bitmap
createBitmap(int width, int height, Config config, boolean hasAlpha, ColorSpace colorSpace);
// mutable bitmap. initial density: display.  color space: sRGB  
createBitmap(DisplayMetrics display, int width, int height, Config config, boolean hasAlpha);
createBitmap(DisplayMetrics diaplay, int width, int height, Config config, boolean hasAlpha, ColorSpace colorSpace);

// immutable bitmap. 每个像素值设置为colors数组中的响应值. color space: sRGB
createBitmap(@NonNull @ColorInt int[] colors, int offset, int stride, int width, int height, Config config);
createBitmap(DisplayMetrics display, @ColorInt int[] colors, int offset, int stride, int width, int height, Config config);
createBitmap(int[] colors, int width, int height, Config config);
createBitmap(DisplayMetrics display, int colors[], int width, int height, Config config);

// immutable bitmap. 使用给定Picture资源创建Bitmap  
createBitmap(Picture source);
createBitmap(Picture sourece, int width, int height, Config config);
  1. Bitmap压缩
/*
 * 把当前bitmap压缩后写入输出流中, 若返回true, 则该bitmap可被BitmapFactory.decodeStream()恢复. 需要注意的是, 并不是所有的bitmap都支持所有的格式, BitmapFactory恢复回来的bitmap可能与原来有所不同.  
 * @param CompressFormat 枚举类型, 值有: JPEG/PNG/WEBP
 * @param quality 对应0-100
 * @param stream 压缩后结果的输出流
 */
public boolean compress(CompressFormat format, int quality, OutputStream steam) {
    checkRecycled("Can't compress a recycled bitmap");
    // do explicit check before calling the native method
    if (stream == null) {
        throw new NullPointerException();
    }
    if (quality < 0 || quality > 100) {
        throw new IllegalArgumentException("quality must be 0..100");
    }
    Trace.traceBegin(Trace.TRACE_TAG_RESOURCES, "Bitmap.compress"); 
    boolean result = nativeCompress(mNativePtr, format.nativeInt, quality, stream, new byte[WORKING_COMPRESS_STORAGE]);
    Trace.traceEnd(Trace.TRACE_TAG_RESOURCES);
    return result;
}
  1. Bitmap 回收
/*
 * 释放与bitmap关联的native对象;
 * 清除像素数据mBuffer的引用;
 * mRecycled标志位设置为true后再调用bitmap方法则会异常;
 */
public void recycle() {
    if (!mRecycled && mNativePtr != 0) {
        if (nativeRecycle(mNativePtr)) {
            // return value indicates whether native pixel object was actually recycled.
            // false indicates that it is still in use at the native level and these
            // objects should not be collected now. They will be collected later when the
            // Bitmap itself is collected.
            mNinePatchChunk = null;
        }
        mRecycled = true;
    }
}
  1. Bitmap 所占内存
/*
 * 返回存储bitmap对象所需要的内存, 当对bitmap所占内存区域进行服用的时候,该函数返回结果可能要大于getByteCount的值, 否则, 其与getByteCount的值相同.  
 * 此值在bitmap整个生命周期都不会改变
 */
public final int getAllocationByteCount() {
    if (mRecycled) {
        Log.w(TAG, "Called getAllocationByteCount() on a recycle()'d bitmap! "
                + "This is undefined behavior!");
        return 0;
    }
    return nativeGetAllocationByteCount(mNativePtr);
}
/*
 * 表示存储bitmap像素所需要的最小字节, 自从4.4之后, 这个就不能用来确定bitmap占用的内存了,需要用getAllocationByteCount.  
 */
public final int getByteCount() {
    if (mRecycled) {
        Log.w(TAG, "Called getByteCount() on a recycle()'d bitmap! "
                + "This is undefined behavior!");
        return 0;
    }
    // int result permits bitmaps up to 46,340 x 46,340
    return getRowBytes() * getHeight();
}

BitmapFactory

  1. 获取bitmap方法
    alt

  2. BitmapFactory.Options类

    1. Bitmap inBitmap
      若给options设置了此bitmap, 那么通过options解码的时候, 返回的bitmap会尝试复用这个options中的bitmap, 如果不能复用返回null, 要求服用的bitmap是mutable;
    2. boolean inJustDecodeBounds
      若设为true, 那么解码方法返回null, 但是它会设置outXXX的值, 这样调用者可以在不用解码整张图片的前提下查询到bitmap的宽高;
    3. int inSampleSize
      对原来的图片进行采样, 如果inSampleSize为4, 那么图片的宽高会缩短到原来的1/4, 达到减小内存的目的;
    4. Bitmap.Config inPreferredConfig
      图片解码的格式要求.

https://www.jianshu.com/p/abc756158cf6
https://www.jianshu.com/p/5f02db4a225d

posted @ 2020-09-13 16:35  willwuss  阅读(397)  评论(0编辑  收藏  举报