Bitmap位图详解

时间:2024-06-10 07:20:35

Bitmap(位图)的一些使用,而在开始本节的内容之前我们 先来区分几个名词的概念:

  • Drawable:通用的图形对象,用于装载常用格式的图像,既可以是PNG,JPG这样的图像, 13种Drawable类型的可视化对象!我们可以理解成一个用来放画的——画框
  • Bitmap(位图):我们可以把他看作一个画架,我们先把画放到上面,然后我们可以 进行一些处理,比如获取图像文件信息,做旋转切割,放大缩小等操作
  • Canvas(画布):如其名,画布,我们可以在上面作画(绘制),你既可以用Paint(画笔), 来画各种形状或者写字,又可以用Path(路径)来绘制多个点,然后连接成各种图形
  • Matrix(矩阵):用于图形特效处理的,颜色矩阵(ColorMatrix),还有使用Matrix进行图像的 平移,缩放,旋转,倾斜等
  • Bitmap位图详解
  • 从上图可以看出bitmap的构造是私有的,使用需要用到JNI来实例化,嘿嘿嘿 但是呢 肯定也会给我们提供一个接口给我们来创建Bitmap的,而这个接口类就是:BitmapFactory , 哇哈哈 !
  • 下面来看一下我们的BitmapFactory类:
  • Bitmap位图详解
  • 我们可以找到一种规律,每一种方法里都有一个Options类型的参数,进去看看吧~
  • Bitmap位图详解
  • 这个小可爱居然是一个静态的内部类,哇哈哈,BitmapFacotry.Options 而他是用来设置decode时的选项的!
  • 我们对这里的某些参数的值进行设置,比如inJustDecodeBounds设置为true避免OOM(内存溢出), Bitmap中的 方法比较多,我们从中挑几个用得较多的来讲解
  • 普通方法

    • public boolean compress (Bitmap.CompressFormat format, int quality, OutputStream stream) 将位图的压缩到指定的OutputStream,可以理解成将Bitmap保存到文件中! format:格式,PNG,JPG等; quality:压缩质量,0-100,0表示最低画质压缩,100最大质量(PNG无损,会忽略品质设定) stream:输出流 返回值代表是否成功压缩到指定流!
    • void recycle():回收位图占用的内存空间,把位图标记为Dead
    • boolean isRecycled():判断位图内存是否已释放
    • int getWidth():获取位图的宽度
    • int getHeight():获取位图的高度
    • boolean isMutable():图片是否可修改
    • int getScaledWidth(Canvas canvas):获取指定密度转换后的图像的宽度
    • int getScaledHeight(Canvas canvas):获取指定密度转换后的图像的高度

    静态方法

    • Bitmap createBitmap(Bitmap src):以src为原图生成不可变得新图像
    • Bitmap createScaledBitmap(Bitmap src, int dstWidth,int dstHeight, boolean filter):以src为原图,创建新的图像,指定新图像的高宽以及是否变。
    • Bitmap createBitmap(int width, int height, Config config):创建指定格式、大小的位图
    • Bitmap createBitmap(Bitmap source, int x, int y, int width, int height)以source为原图,创建新的图片,指定起始坐标以及新图像的高宽。
    • public static Bitmap createBitmap(Bitmap source, int x, int y, int width, int height, Matrix m, boolean filter)

    BitmapFactory.Option可设置参数:

    • boolean inJustDecodeBounds——如果设置为true,不获取图片,不分配内存,但会返回图片的高宽度信息。
    • int inSampleSize——图片缩放的倍数。如果设为4,则宽和高都为原来的1/4,则图是原来的1/16。
    • int outWidth——获取图片的宽度值
    • int outHeight——获取图片的高度值
    • int inDensity——用于位图的像素压缩比
    • int inTargetDensity——用于目标位图的像素压缩比(要生成的位图)
    • boolean inScaled——设置为true时进行图片压缩,从inDensity到inTargetDensity。

 

3.获取Bitmap位图

从资源中获取位图的方式有两种:通过BitmapDrawable或者BitmapFactory,下面演示下: 我们首先得获得这个

BitmapDrawable方法

你可以创建一个构造一个BitmapDrawable对象,比如通过流构建BitmapDrawable:

BitmapDrawable bmpMeizi = new BitmapDrawable(getAssets().open("pic_meizi.jpg"));
Bitmap mBitmap = bmpMeizi.getBitmap();
img_bg.setImageBitmap(mBitmap);

BitmapFactory方法

都是静态方法,直接调,可以通过资源ID、路径、文件、数据流等方式来获取位图!

//通过资源ID
private Bitmap getBitmapFromResource(Resources res, int resId) {
      return BitmapFactory.decodeResource(res, resId);
}

//文件
private Bitmap getBitmapFromFile(String pathName) {
      return BitmapFactory.decodeFile(pathName);
}

//字节数组
public Bitmap Bytes2Bimap(byte[] b) {
    if (b.length != 0) {
        return BitmapFactory.decodeByteArray(b, 0, b.length);
    } else {
        return null;
    }
}

//输入流
private Bitmap getBitmapFromStream(InputStream inputStream) {
      return BitmapFactory.decodeStream(inputStream);
}