转载地址:http://www.sohu.com/a/109124147_466964

BitmapFactory是安卓系统解析图片资源的一个常用工具类。其基本的使用方式分为两种:解析系统内部图片资源解析网络图片资源。下面我们分别来谈论这两种图片资源的解析方式。

解析系统内部图片资源
解析系统内部图片资源常用的方法有以下两种:

BitmapFactory.decodeResource(Resource,int)
BitmapFactory.decodeFile(String file)

下面我们先分析BitmapFactory.decodeResource(Resource,int)的使用方法,其中两个参数Resource,int分别表示图片所在的系统资源对象和图片资源ID。请参考以下代码:

 Bitmap pic=BitmapFactory.decodeResource(this.getResources(),R.mipmap.ic_launcher);imageView.setImageBitmap(pic);

再分析BitmapFactory.decodeFile(String file)的使用方法,其中参数file表示要解析本地图片文件路径。比如,我们在系统SDCARD的Pictures目录存放有名字为messi.jpg的图片,则解析代码如下:


//判断系统是否安装有SD卡
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {//获取SD卡的系统目录File sdcarDir=Environment.getExternalStorageDirectory();//获取SD卡的绝对路径String path=sdcarDir.getAbsolutePath();//解析SD卡里的图片资源Bitmap pic=BitmapFactory.decodeFile(path+File.separator+"Pictures"+File.separator+"messi.jpg");imageView.setImageBitmap(pic);}

解析网络图片资源
解析网络图片资源有两种方式:

BitmapFactory.decodeStream(InputStream);
BitmapFactory.decodeByteArray(byte[],offset,len);

首先分析BitmapFactory.decodeStream(InputStream);的使用方法,其中参数InputStream表示要解析的网络图片的输入流。要获取网络资源我们必须要通过HttpURLConnection对象来连接网络资源,具体实现代码如下:

  1. 由于安卓不允许在非主线程更新UI,所有我们必须先创建一个线程类负责下载网络图片资源,并构造一个Bitmap对象。
class DownloadThread extends  Thread{@Overridepublic void run() {try {URL url=new URL(link);//获取网络图片资源的URL//获得HttpURLConnection对象HttpURLConnection coon=(HttpURLConnection)url.openConnection();coon.setDoInput(true);//允许输入流,即允许下载coon.setUseCaches(false);//不使用缓冲coon.setRequestMethod("GET");//使用get请求InputStream in=coon.getInputStream();//获得图片的输入流pic = BitmapFactory.decodeStream(in);in.close();handler.sendEmptyMessage(1);//使用handler对象发送消息,提醒主线程更新UI} catch (IOException e) {e.printStackTrace();}}}
  1. 在主线程的onCreate()方法中启动下载网络图片的线程,并使用handler对象接收消息更新UI。
//创建handler对象并接收消息更新UIHandler handler=new Handler(){@Overridepublic void handleMessage(Message msg) {if(msg.what==1){imageView.setImageBitmap(pic);}}}new DownloadThread().start();//启动下载图片线程

再分析BitmapFactory.decodeByteArray(byte[],offset,len);的使用方法,三个参数分别表示图片资源的字节数组,偏移量和长度。实现思路与BitmapFactory.decodeStream(InputStream);类似,所不同是需要从输入流构造出对应图片的字节数组,实现代码如下:

  1. 由于安卓不允许在非主线程更新UI,所有我们必须先创建一个线程类负责下载网络图片资源,并构造一个Bitmap对象。
class DownloadThread extends  Thread{@Overridepublic void run() {try {URL url=new URL(link);//获取网络图片资源的URL//获得HttpURLConnection对象HttpURLConnection coon=(HttpURLConnection)url.openConnection();coon.setDoInput(true);//允许输入流,即允许下载coon.setUseCaches(false);//不使用缓冲coon.setRequestMethod("GET");//使用get请求InputStream in=coon.getInputStream();//获得图片的输入流ByteArrayOutputStream bout=new ByteArrayOutputStream();//byte[] buff=new byte[1024];//定义缓冲区int len=-1;//不断地从输入流读取字节数组while((len=in.read(buff))!=-1){bout.write(buff,0,len);}byte[] arr=bout.toByteArray();//字节数组输出流转换为字节数组pic = BitmapFactory.decodeByteArray(arr,0,arr.length);in.close();handler.sendEmptyMessage(1);//使用handler对象发送消息,提醒主线程更新UI} catch (IOException e) {e.printStackTrace();}}}
  1. 在主线程的onCreate()方法中启动下载网络图片的线程,并使用handler对象接收消息更新UI。
//创建handler对象并接收消息更新UIHandler handler=new Handler(){@Overridepublic void handleMessage(Message msg) {if(msg.what==1){imageView.setImageBitmap(pic);}}}new DownloadThread().start();//启动下载图片线程

BitmapFactory解析图片方法大全相关推荐

  1. android 图片的处理方法,Android图片处理,ImageView的属性和方法大全

    原标题:Android图片处理,ImageView的属性和方法大全 通过前面几期的学习,TextView控件及其子控件基本学习完成,可以在Android屏幕上显示一些文字或者按钮,那么从本期开始来学习 ...

  2. matlab在sin处出现解析错误,破除“解析包时出现错误”方法大全,全部都在这了!...

    原标题:破除"解析包时出现错误"方法大全,全部都在这了! 相信许多使用Android设备的用户都会或多或少的遇到到这样的问题:解析包时出现错误.那么遇到这样的问题该如何解决? 其实 ...

  3. matlab在tic处出现解析错误,破除“解析包时出现错误”方法大全,全部都在这了!...

    原标题:破除"解析包时出现错误"方法大全,全部都在这了! 相信许多使用Android设备的用户都会或多或少的遇到到这样的问题:解析包时出现错误.那么遇到这样的问题该如何解决? 其实 ...

  4. android 多张图片动态效果,Android图片处理,ImageView的属性和方法大全

    通过前面几期的学习,TextView控件及其子控件基本学习完成,可以在Android屏幕上显示一些文字或者按钮,那么从本期开始来学习如何在进行图片展示,这就是涉及到另外一个非常重要的控件家族,那就是I ...

  5. OkHttp框架从入门到放弃,解析图片使用Picasso裁剪,二次封装OkHttpUtils,Post提交表单数据...

    OkHttp框架从入门到放弃,解析图片使用Picasso裁剪,二次封装OkHttpUtils,Post提交表单数据 我们这片博文就来聊聊这个反响很不错的OkHttp了,标题是我恶搞的,本篇将着重详细的 ...

  6. 深度解析——图片加载到内存中的大小计算内存优化

    本篇文章已授权微信公众号 hongyangAndroid (鸿洋)独家发布 最近封装了个高斯模糊组件,正好将图片相关的理论基础也梳理了下,所以,这次就来讲讲,在 Android 中,怎么计算一张图片在 ...

  7. BitmapFactory压缩图片

    我们编写的应用程序都是有一定内存限制的,程序占用了过高的内存就容易出现OOM(OutOfMemory)异常.所以在展示高分辨率图片或者上传图片的时候,最好先将图片进行压缩.下面看下我们如何对一张大图进 ...

  8. OkHttp框架从入门到放弃,解析图片使用Picasso裁剪,二次封装OkHttpUtils,Post提交表单数据

    OkHttp框架从入门到放弃,解析图片使用Picasso裁剪,二次封装OkHttpUtils,Post提交表单数据 我们这片博文就来聊聊这个反响很不错的OkHttp了,标题是我恶搞的,本篇将着重详细的 ...

  9. XSS攻击绕过过滤方法大全(转)

    XSS攻击绕过过滤方法大全(约100种) 文章目录 XSS攻击绕过过滤方法大全(约100种) 1.XSS定位器 2.XSS定位器(短) 3.无过滤绕过 4.利用多语言进行过滤绕过 5.通过JavaSc ...

最新文章

  1. DotNet的JSON序列化与反序列化
  2. 算法---------x 的平方根
  3. python主要是干什么用的-Python到底可以干什么?主要应用领域
  4. C#中使用DbHelper连接SqlServer数据库
  5. python long函数_python 内置函数
  6. linux centos7使用,linux之centos7防火墙基本使用
  7. 【Java】冒泡排序
  8. pytorch初试:CNN实现
  9. mysql 不用缓存_mysql有自己的缓存机制,为什么还要用redis和memcac? 爱问知识人
  10. 毕设题目:Matlab图像加密
  11. Nginx+uwsgi+Django项目部署后,url长度限制修改
  12. mac idea修改内存
  13. 理解手机中的感应器模块:重力感应/光线感应/电子罗盘/陀螺仪模块功能
  14. MyEclipse中常用的查找快捷键
  15. 【PostgreSQL逻辑复制数据同步到kafka】
  16. win7装xp(win7装xp双系统教程)
  17. 机器学习中在线学习、批量学习、迁移学习、主动学习的区别
  18. 如何强力卸载流氓软件
  19. Ubuntu 18.04 安装网卡驱动(有线连接)
  20. matlab - 3 自由度的机械臂

热门文章

  1. FIDES.DV-Partner.Suite.2015.050 1DVD
  2. 怎么清空回收站?3分钟解决!
  3. js(JavaScript)高级
  4. 算法与实战 - 常见的数据处理技巧
  5. linux硬盘引导区坏了,我的硬盘主引导区坏了,怎么修好?
  6. SQA0.G38、SQV0.G38、SQC0.M22插装式顺序阀
  7. 国内NFT数字藏品平台有哪些值得玩?
  8. SSM框架项目各文件内容及项目实践
  9. xt1085android7.1,MOTO X+1(XT1085)官方解锁bootloader图文教程+去掉提示
  10. Java输入输出(IO)和流的基本概念以及几种方法