11.2 Bitmap

简介

用于图像处理,可以获取图像文件信息,进行图像剪切、旋转、缩放等操作,并可以指定格式保存图像文件。


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、宽、高,创建新的图像


Bitmap与其他格式之间转换

转换

使用

使用
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 2021期待与你一起共事,点击查看岗位[https://www.jianshu.com/p/6f4d67fa406...
    闲庭阅读 16,719评论 0 75
  • Bitmap API 1.简介 Bitmap是Android系统中的图像处理的最重要类之一,通过bitmap可以获...
    子墨_guo阅读 3,227评论 0 7
  • 图片压缩就是为了避免我们内存溢出,所有要对一系列进行压缩二次采样等 1.什么是OOM?为什么会引起OOM? out...
    lay_wn阅读 994评论 0 1
  • BitMap压缩以及二次采样 标签: Android 首先我们来了解一下什么是oom? 1.什么是OOM?为什么会...
    Zane_Samuel阅读 1,472评论 1 3
  • 情之所以可贵,在于真、深、纯,爱之所以可歌,在于暖、润、亲,恋之所以可敬,在于美、妙、灵。一段连接,一个刻度,一份...
    木心幽兰阅读 173评论 0 0