Android bitmap讲解与实践
来源:互联网 发布:安卓与php服务器端 编辑:程序博客网 时间:2024/06/07 00:07
一、概述
bitmap 相信我们在 android 开发中都不陌生,那么这个 bitmap 到底是什么呢,总结起来就是两个字:位图。
bitmap可以对图片进行裁剪,缩放,旋转等操作,在 Android 图像处理中有着非常重要的地位。
二、Bitmap 的创建
说到 bitmap ,首先要说一下这个 bitmapDrawable ,这个 BitmapDrawable 是管理和存储 bitmap 的一个类。
下面看一段代码:
BitmapDrawable bitmapDrawable = new BitmapDrawable(bitmap); bitmap = bitmapDrawable.getBitmap();
可以看到 bitmap 和 bitmapDrawable 之间的转换是非常轻松的。其实 bitmapDrawable 中还有很多方法获取一些信息。
例如是否过滤,位置信息,是否抗锯齿等。
说完了 bitmapDrawable,下面说一下 bitmap 的创建。bitmap 的大部分创建都是由 BitmapFactory 来完成的,不过 bitmap 自 身也是可以创建 bitmap 的。
下面看一段代码:
Bitmap bitmap1 = Bitmap.createBitmap(bitmap,1,1,40,40); ivSeePicture.setImageBitmap(Bitmap.createScaledBitmap(bitmap,400,400,true)); //这个false作用是是否需要过滤
第一个方法创建 bitmap 是从源 bitmap 的(1,1)点开始截取长度为 40 的图片。
第二个方法是对 bitmap 进行缩放,把原位图缩放为宽高为 400 的位图。
总所周知,bitmap 是非常消耗内存的,那么 Google 给我们提供了回收 bitmap 的方法。首先我们可以通过 isRecycle 来判断这个 bitmap 的是否被回收了,如果没被回收,我们可以通过 recycle() 进行回收。所以当我们不确定这个 bitmap 是否使用的时候,我们可以通过这两个方法回收 bitmap。
下面说一个方法:Bitmap.createBitmap(int width,int height,Config config)
这个方法创建的是一个空的 Bitmap ,那么通过这个方法创建的 Bitmap 是需要通过 Canvas 去对这个 Bitmap 进行绘制的。
可以看到这个方法中有一个 config 的参数,这个 config 有以下几种:
Bitmap.config:可以设置 bitmap 位图的配置,可以决定位图的色彩,透明度,像素如何。
- Bitmap.Config ALPHA_8 :如果浮层可以使用这个配置。每个像素 1 字节
- Bitmap.Config RGB_565 :没有透明度的位图 每个像素2字节 5 6 5红绿蓝
- Bitmap.Config ARGB_4444 :质量差一点,但是还需要设置透明度可以用这个 2字节。
- Bitmap.Config ARGB_8888:质量特别高每个像素4个字节。
最后说一个方法:bitmap.createBitmap(bitmap,x,y,width,height, Matrix m,boolean filter) 从原位图获取长宽的位图
并按 Matrix 规则进行变换。这个boolean 值代表是否过滤,通过这个方法可以对 bitmap 进行 Matrix 的转换,答到一
些炫酷的效果。
bitmap 的方法基本上介绍的差不多了下面就介绍一下获取 bitmap 的强大工具类,BitmapFactory。
三、BitmapFactory 创建 Bitmap
bitmapFactory 的主要部分就是如何获取 bitmap,我们先看几个 API:
1、decodeByteArray :从指定字节开始截取 length 长度的字节数据解析成 bitmap。
2、decodeFile(pathName):从 pathName 解析出并创建对象。
3、decodeFileDescriptor(FileDescriptor fd):从 FileDescriptor 对应的文件中解析创建 bitmap 对象。
4、decodeStream:从输入流中解析创建 bitmap 对象。
5、descodeResource(Resource resource,int id):从 drawable 获取 bitmap 。
其实不仅仅这几个方法,BitmapFactory 还有很多方法能获取到 bitmap,不过总结一下获取 bitmap 一共有五个地方,分别是
字节,文件名,文件描述符,流中,drawable。那基本上 bitmapFactory 的知识点也就这么多,不过在BitmapFactory 中有一个
重要的内容,那就是 option,下面我们看一下这个 option 有什么功能。
bitmapFactory.option :在通过 bitmapFactory 获取 bitmap 的时候可以去设置一个 option,那么根据这个 option 可以去设置
得到的 bitmap 的一些属性,那么下面就列举一些属性:
booleaninBitmap :如果设置了这个属性为 true,那么就会复用 bitmap 对象,复用的操作分为两步,首先保存废弃的 bitmap,使用保
存的bitmap。
int density:通过这个属性可以设置获取 bitmap 的像素密度属性。
int inSample:如果设置为值> 1,请求解码器子样品原始图像,返回一个较小的图像以节省内存。例如,inSampleSize = 4返回一
个对象是1/4的宽度/高度,和1/16像素的bitmap。任何值<= 1 和 1 一样对待。注意:这个值一定是 2 的幂次方,,其他任何值将
被四舍五入到最近的2的幂。最后总结一下,这个值可以设置 bitmap 占用内存的大小。多用于图片的压缩。
inJustDecodeBounds:通过设置此属性,然后获取到的 bitmap 的对象时 null,但是可以通过 option 获取图标的大小的属性。
下面看一段代码:
BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.drawable.ditu,options); int width = options.outWidth; int heigth = options.inDensity; if(options.inSampleSize > 1){ //对图片进行压缩然后在重新可以直接对 inSampleSize 直接进行赋值还有outWidth 然后重新去通过decodeResource 获取图片设置 option 就可以达到缩放的功能 options.inSampleSize = options.inSampleSize / 2; Bitmap bitmap1 = BitmapFactory.decodeResource(getResources(),R.drawable.ditu,options); }
可以看到这段代码显示通过设置 injustDecodeBounds 属性来获取 drawable 的相关信息,然后通过判断 inSampleSize 属性
来判断图片是否过大,如果过大重新设置 option,然后再去加载,这样就可以防止 ANR 的产生。其实还可以通过 width和
heigth来判断的图片的大小的。在去重新设置。
四、使用中的注意
1、当我们用这些方法去加载图片到内存的时候,有可能 ANR ,因为加载的时间是不可测的,所以我们不要在 UI 线程中加载图片,我们可以通过 AnsyncTask 去加载图片
2、在我们使用 Bitmap 的时候是一定要缓存的,缓存之后加载速度会非常的快。
3、确认图片不在使用的时候应该尽早释放图片的内存。也就是当我们不用这个 Bitmap 的时候我们需要去判断一下这Bitmap是否被回收了,如果没回收调用 recycle 去回收。
总结:
本文讲了 bitmap 的大部分的知识,如果不是做图片处理,这些知识基本够用了,本文如有什么问题欢迎指出,共同进步。
阅读全文
1 0
- Android bitmap讲解与实践
- Android handler讲解与实践
- Android Bitmap与Canvas
- Android Drawable与Bitmap
- Android实践:如何高效加载Bitmap
- Android的Bitmap与Drawable
- android Bitmap与string互转
- android Bitmap 与Drawable转换
- Android 中的bitmap与drawable
- android Bitmap与string互转
- android Bitmap与string互转
- android Bitmap与string互转
- Android Bitmap与String互转
- android Bitmap与string互转
- android Bitmap与string互转
- android-bitmap与string互转
- Android Bitmap与String互转
- Android事件总线分发库EventBus3.0的简单讲解与实践
- Mysql Engine类型
- 前端可做那些优化?seo?
- ATOM进行右键添加
- 算法题100-快速售票系统的座位登记
- 阿里面试回来,想和Java程序员谈一谈
- Android bitmap讲解与实践
- 初学Web:计算机气质个人主页
- 开发一个自动点击工具
- R语言使用Apriori规则完成关联挖掘
- Poco库Timer定时器
- ARIMA差分自回归模型python代码
- EffectiveC++学习笔记-条款3
- 【每天一点linux】进程间通信--信号
- Ubuntu16.04 安装 Adouble Falsh Player