Bitmap知识点小结
来源:互联网 发布:知乎回答问题 出错了 编辑:程序博客网 时间:2024/05/16 11:16
Bitmap:
位图,是在图片操作中经常会用到的一种类型。
常见的位图有16位,32位。现在android设备中可以直接使用ARGB8888。
16位位图,对于图片的效果支持上来说,没有32位支持的多。
Bitmap的常见用法
一、获取Bitmap的方法:
1.BitmapFactory.decodeXXX:
这种获取的bitmap的方式,是从一些其他的资源中进行获取。
这其中包含:二进制的字节数组(byte[])、文件(file)、项目资源(res)、流(stream)、文件描述符(FileDescriptor)。
- 由于从外部资源获取Bitmap的时候有可能图片资源过大,发生OOM,所以为避免发发生上述异常,常用BitmapFactory.Options进行处理,具体使用方法请参照下面二标题。
2.使用Bitmap.createBitmap(XXX,XXX,XXX…):
这种方式创建的Bitmap对象一般是根据一个现有的Bitmap对象来创建一个新的Bitmap对象。
使用这种方式创建的位图对象一般有可变和不可变之分。
如果是一个可变的,创建方式一般使用以下方式:
//参数一:创建的新bitmap的宽度 参数二:创建的新bitmap的高度 参数三:config位图信息Bitmap bitmap = Bitmap.createBitmap(width, height, Config.ARGB_8888);
这种位图对象一般会结合canvas进行使用,放置在Canvas的构造函数中,进行关联:
Canvas canvas = new Canvas(bitmap);
还可以创建一些不可变的位图:
//相当于完整的复制了一份Bitmap bitmap = Bitmap.createBitmap(src) //这种创建的位图可以指定出现的x,y轴的位置以及出现的宽和高。如果宽高和原图一致,也相当于复制Bitmap bitmap = Bitmap.createBitmap(source, x, y, width, height)//也可以指定Matrix对象,对bitmap进行操作(利用Matrix进行图片操作)。Bitmap bitmap = Bitmap.createBitmap(source, x, y, width, height, m, filter)
3.从View中获取Bitmap:
Android中经常会遇到把View转换为Bitmap的情形,比如,对整个屏幕视图进行截屏并生成图片等:
但是需要注意:
调用getDrawingCache()方法获取bitmap之前,要先设置setDrawingCacheEnabled(true)。否则,无法从View对象中获取图像;
在调用getDrawingCache()方法从View对象获取图像之后,记得要调用setDrawingCacheEnabled(false)方法,以清空cache缓冲区,否则,下一次从View对象中获取的图像,还是原来的图像。
//调用方法,获取图片之前view.setDrawingCacheEnabled(true);view.buildDrawingCache();Bitmap bitmap = view.getDrawingCache();//获取完之后记得关闭cacheview.setDrawingCacheEnabled(false);view.destroyDrawingCache();
二、怎样将一个Bitmap转化成View
如果涉及到将一个bitmap转化成view,很容易就会想到ImageView.setImageBitmap(bitmap)。
所以可以参考其源码。具体的设计点还是ImageView继承自View,使用Canvas绘图的过程中将这个bitmap绘制到ImageView关联的画布上。
1.Bitmap在保存文件时常用方法:
bitmap.compress(CompressFormat,quality,outputstream);
表示的意思是将一个bitmap对象压进指定的流对象
参数一类型(CompressFormat.JPEG或者CompressFormat.PNG)
指定的质量比(参数二:0~100)
指定的流对象(参数三:outputStream的子类)
如果该流对象关联了文件。就可以实现将文件保存本地,也可以将流中的内容转化成其他的数据类型,比如二进制的字节数组。
2.OOM问题:
在通过BitmapFactory.decodeFile(String path)方法将图片转成Bitmap时,遇到大一些的图片,我们经常会遇到OOM(Out Of Memory)的问题。怎么避免它呢?
这就用到了我们上面提到的BitmapFactory.Options这个类。
这个类,有一个字段叫做 inJustDecodeBounds 。SDK中对这个成员的说明是这样的:
If set to true, the decoder will return null (no bitmap), but the out…
也就是说,如果我们把它设为true,那么BitmapFactory.decodeFile(String path, Options opt)并不会真的返回一个Bitmap给你,它仅仅会把它的宽,高取回来给你,这样就不会占用太多的内存,也就不会那么频繁的发生OOM了。
示例代码如下:BitmapFactory.Options options = new BitmapFactory.Options();options.inJustDecodeBounds = true;//设为true,只拿宽高数据Bitmap bmp = BitmapFactory.decodeFile(path, options);
**options.outWidth 和 options.outHeight就是我们想要的宽和高了。
有了宽,高的信息,我们怎样在图片不变形的情况下获取到图片指定大小的缩略图呢?**
比如我们需要在图片不变形的前提下得到宽度为200的缩略图。
那么我们需要先计算一下缩放之后,图片的高度是多少int height = options.outHeight * 200 / options.outWidth;//图片高度与宽度比,乘上缩略后的宽度options.outWidth = 200;//缩略图的宽度options.outHeight = height;//缩略图的高度 options.inJustDecodeBounds = false;//调回false,拿到bitmapBitmap bmp = BitmapFactory.decodeFile(path, options);image.setImageBitmap(bmp);
这样虽然我们可以得到我们期望大小的ImageView
但是在执行BitmapFactory.decodeFile(path, options);时,并没有节约内存。要想节约内存,还需要用到BitmapFactory.Options这个类里的 inSampleSize 这个成员变量。
我们可以根据图片实际的宽高和我们期望的宽高来计算得到这个值。
inSampleSize = options.outWidth / 200;
另外,为了节约内存我们还可以使用下面的几个字段:options.inPreferredConfig = Bitmap.Config.ARGB_4444; // 默认是Bitmap.Config.ARGB_8888options.inPurgeable = true;options.inInputShareable = true;
- Bitmap知识点小结
- bitmap 小结
- 知识点小结
- 知识点小结
- 知识点小结
- 知识点小结
- 知识点小结
- 知识点小结
- 知识点小结
- Android Bitmap 知识点梳理
- Android Bitmap 知识点梳理
- Android Bitmap 知识点梳理
- Android Bitmap 知识点梳理
- Android Bitmap 小结
- android Bitmap小结
- android Bitmap用法小结
- android Bitmap小结
- Displaying Bitmap小结
- 自定义竖直的progressbar
- zstu 1090 Common Subsequence
- 安卓解析 json 4种格式 全解析
- 广师Android群分享之代码工具集合
- Delphi XE6 String转MemoryStream
- Bitmap知识点小结
- 1021 Fibonacci Again
- CGRectGet的几种用法
- Android Drawable 那些不为人知的高效用法
- iOS禁止默认拉伸现象
- 线性布局LinearLayout的使用
- java程序验证哥德巴赫猜想
- 广师Android群分享之代码版本控制系统
- CSS样式设置详解