android开发之bitmap使用
bitmap是android中重要的图像处理工具类,通过bitmap可以对图像进行剪切、旋转、缩放等操作,同时还可以指定格式和压缩质量保存图像文件。
一、拿到一个Bitmap对象
查看源码我们知道,Bitmap被final修饰,因此不可以通过new来获得一个bitmap的实例,获得一个Bitmap对象一般都是通过BitmapFactory来获得,主要有以下几方式。
每一个方法都有自己的重载方法,重载方法多出的参数是Options,解释一下这个参数,这个主要是对生成Bitmap对象做一些简单的处理。
inPreferredConfig 指定decode到内存中,手机中所采用的编码,可选值定义在Bitmap.Config中。缺省值是ARGB_8888。
inJustDecodeBounds 如果设置为true,并不会把图像的数据完全解码,亦即decodeXyz()返回值为null,但是Options的outAbc中解出了图像的基本信息。
inSampleSize 设置decode时的缩放比例。当值大于1时会对图像进行压缩,比如设置为4时,返回的图像宽高都将是原始图像的四分之一,像素是原始图像的十六分之一,如果设置的值小于1,则会被当作1来处理。注意,这里设值必须是2的次幂,其他值会被就近取离2的次幂最近的值。
通过option的这些属性,我们就可以获得一张图片的缩略图啦,一个基本思路是先设置inJustDecodeBounds为true,拿到图像的基本信息,比如宽和高,根据基本信息结合缩略图目标宽高,算出inSampleSize ,然后再设置inJustDecodeBounds为false,获得缩略图。
想要获得一个Bitmap对象,可以通过一个图像的完整路径,或者是通过一个字节流或者是通过字节亦或者是通过本地的资源文件,都可以获得一个Bitmap对象。
if (Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED)) {
// /storage/emulated/0/DCIM/Camera/123.jpg
String path = Environment.getExternalStorageDirectory()
.getAbsolutePath()
+ File.separator
+ "DCIM"
+ File.separator
+ "Camera"
+ File.separator
+ "123.jpg";
BitmapFactory.Options option = new BitmapFactory.Options();
option.inSampleSize = 1;
//通过完整路径获得Bitmap对象
Bitmap bm = BitmapFactory.decodeFile(path,option);
FileInputStream is = new FileInputStream(new File(path));
//通过一个输入流获得Bitmap对象
Bitmap bm2 = BitmapFactory.decodeStream(is);
//通过本地资源获得一个Bitmap对象
Bitmap bm1 = BitmapFactory.decodeResource(getResources(),
R.drawable.ic_launcher);
iv.setImageBitmap(bm2);
}
二,保存图像文件
拿到了Bitmap之后可以直接显示出来,也可以先保存到本地等待处理,Bitmap可以保存为jpg,png,gif等格式,保存方式也是非常简单:
Bitmap bp = revitionImageSize(path + "123.jpg");
FileOutputStream out = new FileOutputStream(path + "456.gif");
//0意味着压缩到最小,100意味着压缩后的质量最好,PNG是无损图像,会忽略这个参数
// bp.compress(Bitmap.CompressFormat.JPEG, 100, out);
bp.compress(Bitmap.CompressFormat.PNG, 0, out);
out.flush();
out.close();
直接调用compress方法,第一个参数表示压缩的方式,有多种,PNG属于无损压缩,JPEG是有损压缩。第二个参数表示压缩质量,取值为0-100,100表示压缩图像质量最高,但同时压缩率低,0表示压缩图像质量最差,同时压缩率高。但是,这个参数是否有效与第一个参数有关,如果第一个参数选择了PNG,及无损压缩,那么第二参数是无效的。第三个参数是你要输出的字节流。
版权声明:本文为博主原创文章,未经博主允许不得转载。若有错误地方,还望批评指正,不胜感激。
android开发之bitmap使用的更多相关文章
- Android开发之Bitmap.Config.RGB_565
在学习xutils框架的时候,看到sample代码中有一行这样的代码: bitmapUtils.configDefaultBitmapConfig(Bitmap.Config.RGB_565); Bi ...
- 【转】Android开发之Bitmap的内存优化详解
本文来源:转载自: http://mobile.51cto.com/abased-410796.htm 在Android应用里,最耗费内存的就是图片资源.而且在Android系统中,读取位图Bitma ...
- Android开发之Bitmap二次采样
Bitmap二次采样,听着好像是一个高大上的事,其实也就那么回事,今天我们就来看看Bitmap的二次采样问题. 1.为什么要二次采样 OK,那么首先我要 解决的一个问题就是为什么我们要二次采样? 不知 ...
- Android开发之Bitmap的高效加载
BitmapFactory类提供了四类方法:decodeFile, decodeResource, decodeStream和decodeByteArray 分别用于支持从文件系统,资源,输入流以及字 ...
- android开发之Bitmap 、byte[] 、 Drawable之间的相互转换
一.相关概念 1.Drawable就是一个可画的对象,其可能是一张位图(BitmapDrawable),也可能是一个图形(ShapeDrawable),还有可能是一个图层(LayerDrawable) ...
- Android开发之InstanceState详解
Android开发之InstanceState详解 本文介绍Android中关于Activity的两个神秘方法:onSaveInstanceState() 和 onRestoreInstanceS ...
- Android开发之InstanceState详解(转)---利用其保存Activity状态
Android开发之InstanceState详解 本文介绍Android中关于Activity的两个神秘方法:onSaveInstanceState() 和 onRestoreInstanceS ...
- Android开发之Java集合类性能分析
对于Android开发者来说深入了解Java的集合类很有必要主要是从Collection和Map接口衍生出来的,目前主要提供了List.Set和 Map这三大类的集合,今天Android吧(ard8. ...
- Android开发之Git配置
Android开发之Git配置 1.首先git配置: 输入命令: git config --global user.name "xxx.xx" git config --globa ...
随机推荐
- BZOJ 1634: [Usaco2007 Jan]Protecting the Flowers 护花
Description Farmer John went to cut some wood and left N (2 <= N <= 100,000) cows eating the g ...
- Django自定义上传目录
由于数据库的upload_to功能,有时不能满足每次上传灵活自定义的需求, 基于DEF的上传,有时不能满足基于CLASS的视图要求, 于是,只好慢慢用土法实现. 当然,首先,要使用上传功能时,form ...
- 利用if else 求已发奖金总数
class Program { static void Main(string[] args) { while (true) ...
- WordPress Woopra plugin remote PHP arbitrary code execution exploit.
测试方法: 提供程序(方法)可能带有攻击性,仅供安全研究与教学之用,风险自负! # Exploit Title: woopra plugins execute arbitrary PHP code E ...
- 【转】virtualbox 4.08安装虚机Ubuntu11.04增强功能失败解决方法
原文网址:http://fuliang.iteye.com/blog/1102998 在笔记本安装Ubuntu11.04增强功能失败 引用 fuliang@fuliang-VirtualBox:~$ ...
- Asp.net--Ajax前后台数据交互
转自:http://www.cnblogs.com/guolebin7/archive/2011/02/22/1961737.html 代码由前后台两部分组成: 前台:(新建一个Default.asp ...
- selenium webdriver(4)---模拟鼠标键盘操作
webdriver提供Actions来模拟鼠标悬浮.拖拽和键盘输入等操作,详细代码见org.openqa.selenium.interactions.Actions.本文通过几个实例来说明Action ...
- PHP中 magic_quotes_gpc 和 magic_quotes_runtime 区别及其反斜线转义问题
php中关于反斜线转义: php中数据的魔法引用函数 magic_quotes_gpc 或 magic_quotes_runtime 设置为on时,当数据遇到 单引号' 和 双引号" ...
- 关于理解《C++ 对象模型》中:把单一元素的数组放在末尾,struct可以拥有可变大小的数组
这一章在第19页,写的好深奥,我竟然没看明白在说什么--之后再看了几遍,终于明白了. 原文: C程序员的巧计有时候却成为c++程序员的陷阱.例如把单一元素的数组放在一个struct的末尾,于是每个st ...
- 在Mac下如何开Wifi
1. 首先打开系统偏好设置,选择共享 2. 把互联网共享给勾上 在里面选择共享来源为以太网,共享方式为Wifi 3. 点开Wifi选项,在里面设置密码(如果需要设置密码的话) 4. 然后看状态栏上的W ...