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 位图
从资源中获取位图的方式有两种
-
BitmapDrawable() 方法
通过创建一个构造一个 BitmapDrawable 对象,比如通过流构建 BitmapDrawable
BitmapDrawable bmpMeizi = new BitmapDrawable(getAssets().open("pic_meizi.jpg")); Bitmap mBitmap = bmpMeizi.getBitmap(); img_bg.setImageBitmap(mBitmap);
-
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);
参考文档
- 官方文档: Bitmap