Android Bitmap 位图

前一章节我们提到 Bitmap(位图) 可以用来对图像做旋转切割,放大缩小等操作

Bitmap BitmapFactory BitmapFacotry.Options

Bitmap 不能直接使用构造方法来实例化一个对象,而是必须使用 BitmapFactory 来创建一个实例

BitmapFactory 提供了大量的静态方法从一张图片或者一个文件描述符或者一个字节数组中创建 Bitmap 实例

// 从字节数组
static Bitmap   decodeByteArray(byte[] data, int offset, int length)
static Bitmap   decodeByteArray(byte[] data, int offset, int length, BitmapFactory.Options opts)

// 从文件
static Bitmap   decodeFile(String pathName)
static Bitmap   decodeFile(String pathName, BitmapFactory.Options opts)

// 从文件描述符
static Bitmap   decodeFileDescriptor(FileDescriptor fd)
static Bitmap   decodeFileDescriptor(FileDescriptor fd, Rect outPadding, BitmapFactory.Options opts)

// 从一个资源
static Bitmap   decodeResource(Resources res, int id)
static Bitmap   decodeResource(Resources res, int id, BitmapFactory.Options opts)
static Bitmap   decodeResourceStream(Resources res, TypedValue value, InputStream is, Rect pad, BitmapFactory.Options opts)

// 从一个输入流
static Bitmap   decodeStream(InputStream is)
static Bitmap   decodeStream(InputStream is, Rect outPadding, BitmapFactory.Options opts)

我们可以看到每种类型都会有一个 BitmapFactory.Options opts 参数

这个 BitmapFactory 的内部静态类用于在 decode 的时候设置各种选项

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

Bitmap

通过 BitmapFactory.decodeXxx() 方法或多了一个 Bitmap 对象后我们就可以调用它的一系列方法了

它的方法很多很多,我大致将它们分为两大类

普通方法

方法 说明
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 为原图,创建新的图片,指定起始坐标以及新图像的高宽
Bitmap createBitmap(Bitmap source, int x, int y, int width, int height,Matrix m, boolean filter) 同上

获取 Bitmap 位图

从资源中获取位图的方式有两种

  1. BitmapDrawable() 方法

    通过创建一个构造一个 BitmapDrawable 对象,比如通过流构建 BitmapDrawable

    BitmapDrawable bmpMeizi = new BitmapDrawable(getAssets().open("pic_meizi.jpg"));
    
    Bitmap mBitmap = bmpMeizi.getBitmap();
    img_bg.setImageBitmap(mBitmap);
    
  2. BitmapFactory() 静态方法

    可以通过资源 ID、路径、文件、数据流等方式来获取位图

    资源 id

    BitmapFactory.decodeResource(res, resId);
    

    文件名

    BitmapFactory.decodeFile(pathName);
    

    字节数组

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

    输入流

    public Bitmap getBitmapFromStream(InputStream inputStream) {
          return BitmapFactory.decodeStream(inputStream);
    }
    

获取 Bitmap 的相关信息

获取了 Bitmap 对象后,就可以调用下面的方法获取信息

方法 说明
getByteCount() 获得大小
getWidth() 获取高度
getHeight() 获取宽度

抠图片上的某一角下来

如果想要把图片上的某一角扣下来,可以调用 Bitmap 对象的静态方法 createBitmap()方法

Bitmap createBitmap(Bitmap source, int x, int y, int width, int height)
参数 说明
source 原图
x 起始坐标 x
y 起始坐标 y
width 截取的宽度
height 截取的高度

使用方法

Bitmap bitmap1 = BitmapFactory.decodeResource(getResources(), R.mipmap.pic_meizi);
Bitmap bitmap2 = Bitmap.createBitmap(bitmap1,100,100,200,200);
img_bg = (ImageView) findViewById(R.id.img_bg);
img_bg.setImageBitmap(bitmap2);

参考文档

  1. 官方文档: Bitmap

Android 基础教程

关于   |   FAQ   |   我们的愿景   |   广告投放   |  博客

  简单教程,简单编程 - IT 入门首选站

Copyright © 2013-2022 简单教程 twle.cn All Rights Reserved.