简介
用于图像处理,可以获取图像文件信息,进行图像剪切、旋转、缩放等操作,并可以指定格式保存图像文件。
BitmapFactory
Bitmap构造是私有的,需要通过工厂类来实例化。
从文件读取图片:public static Bitmap decodeFile(String pathName)
public static Bitmap decodeFile(String pathName, Options opts)
eg:Bitmap bitmap = BitmapFactory.decodeFile("/sdcard/bitmap.png");
从输入流读取图片:不会对所加载的图片进行缩放,相当从resourse占用内存小,效率高
public static Bitmap decodeStream(InputStream is)
public static Bitmap decodeStream(InputStream is, Rect outPadding, Options opts)
eg:InputStream is = mContext.getAssets().open("bitmap.png"); //本地或网络
bitmap = BitmapFactory.decodeStream(is);
从资源文件读取图片:加载的图片可能会经过缩放,消耗内存,大量使用容易OOM。(可将resources转成流,使用流读取)
适用场景:性能要求不高,需要图片自适应情况
public static Bitmap decodeResource(Resources res, int id)
public static Bitmap decodeResource(Resources res, int id, Options opts)
eg:Bitmap bitmap = BitmapFactory.decodeResource(mContext.getResources(),R.raw.bitmap);
从数组读取图片:public static Bitmap decodeByteArray(byte[] data, int offset, int length)
public static Bitmap decodeByteArray(byte[] data, int offset, int length, Options opts)
从文件读取文件 :与decodeFile不同的是这个直接调用JNI函数进行读取,效率比较高。
public static Bitmap decodeFileDescriptor(FileDescriptor fd)
public static Bitmap decodeFileDescriptor(FileDescriptor fd, Rect outPadding, Options opts)
注:除了使用BitmapFactory从资源获取位图,还可以使用BitmapDrawable对象获取位图
( new BitmapDrawable(XXXX).getBitmap )
Option参数
boolean inJustDecodeBounds:设置为true,不获取图片,不分配内存,只返回图片的高度宽度信息
(适用于只想知道bitmap尺寸,不想将其加载到内存)
int inSampleSize:图片缩放的倍数
采样率:1.一般是2的指数1、2、4、8、16....;
2.设置小于1会被当做1处理,1为原始大小;
3.若采样率为2,宽和高为原先1/2,像素和占用内存为原来1/4;
int outWidth:获取图片的宽度值
int outHeight:获取图片的高度值
int inDensity:用于位图的像素压缩比
int inTargetDensity:用于目标位图的像素压缩比(要生成的位图)
byte[] inTempStorage:创建临时文件,将图片存储
boolean inScaled:设置为true时进行图片压缩,从inDensity到inTargetDensity
boolean inDither:如果为true,解码器尝试抖动解码(采用随机噪声色来填充,优化低位图色带明显的问题)
Bitmap.Config inPreferredConfig:设置解码器
String outMimeType:设置解码图像
boolean inPurgeable:当存储Pixel的内存空间在系统内存不足时是否可以被回收
boolean inInputShareable:inPurgeable为true情况下才生效,是否可以共享一个InputStream
boolean inPreferQualityOverSpeed:为true则优先保证Bitmap质量其次是解码速度
boolean inMutable:配置Bitmap是否可以更改,比如:在Bitmap上隔几个像素加一条线段
inScreenDensity:当前屏幕的像素密度
Bitmap.Config inPreferredConfig
Bitmap.Config ARGB_4444:代表 16位 ARGB位图 ,每个像素占用 2byte 内存(glide默认使用这个)
Bitmap.Config ARGB_8888:代表 32位 ARGB位图,每个像素占用 4byte 内存(想提升质量可使用这个)
Bitmap.Config ALPHA_8:代表 8位 Alpha位图,每个像素占用 1byte 内存(只有透明度没有颜色值)()
Bitmap.Config RGB_565:代表 8位 RGB位图,每个像素占用 2byte 内存(没有透明色,会导致每张图都会有一个底)
注:1.位图位数越高代表其可以存储的颜色信息越多,图像越逼真,占用内存越大;
2.Android中一张图片(BitMap)占用的内存 = 图片长度 * 图片宽度 * 单位像素占用的字节数;
常用方法
void recycle() :回收位图占用的内存空间,把位图标记为Dead
boolean isRecycled():判断位图内存是否已释放
int getWidth():获取位图的宽度
int getHeight():获取位图的高度
boolean isMutable():图片是否可修改
int getScaledWidth(Canvas canvas):获取指定密度转换后的图像的宽度
int getScaledHeight(Canvas canvas):获取指定密度转换后的图像的高度
boolean compress(format,quality, stream):按指定的图片格式以及画质,将图片转换为输出流
format:压缩图像的格式,如Bitmap.CompressFormat.PNG或Bitmap.CompressFormat.JPEG
quality:画质0-100,0表示最低画质压缩,100以最高画质压缩(对于PNG等无损格式的图片,会忽略此项设置)
stream: OutputStream中写入压缩数据
return: 是否成功压缩到指定的流
static Bitmap createBitmap(Bitmap src):以src为原图生成不可变得新图像
static Bitmap createScaledBitmap(...):以src为原图,指定高、宽、是否可变,创建新的图像
static Bitmap createBitmap(int width, int height, Config config):创建指定格式、大小的位图
static Bitmap createBitmap(...) //以source为原图,指定起始坐标xy、宽、高,创建新的图像
网友评论