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与其他格式之间转换

转换

使用

使用
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,723评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,003评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,512评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,825评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,874评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,841评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,812评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,582评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,033评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,309评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,450评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,158评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,789评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,409评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,609评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,440评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,357评论 2 352

推荐阅读更多精彩内容

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