Android菜鸟成长记15 -- BitMap

BitMap简介

  Bitmap是Android系统中的图像处理的最重要类之一。用它可以获取图像文件信息,进行图像剪切、旋转、缩放等操作,并可以指定格式保存图像文件。本文从应用的角度,着重介绍怎么用Bitmap来实现这些功能。

BitMap的常用属性

1. BitMap类
  public void recycle()——回收位图占用的内存空间,把位图标记为Dead 
  public final boolean isRecycled() ——判断位图内存是否已释放 
  public final int getWidth()——获取位图的宽度 
  public final int getHeight()——获取位图的高度 
  public final boolean isMutable()——图片是否可修改 
  public int getScaledWidth(Canvas canvas)——获取指定密度转换后的图像的宽度 
  public int getScaledHeight(Canvas canvas)——获取指定密度转换后的图像的高度 
  public boolean compress(CompressFormat format, int quality, OutputStream stream)——按指定的图片格式以及画质,将图片转换为输出流。 
  format:Bitmap.CompressFormat.PNG或Bitmap.CompressFormat.JPEG 
  quality:画质,0-100.0表示最低画质压缩,100以最高画质压缩。对于PNG等无损格式的图片,会忽略此项设置。

常用的静态方法: 
  public static Bitmap createBitmap(Bitmap src) ——以src为原图生成不可变得新图像 
  public static Bitmap createScaledBitmap(Bitmap src, int dstWidth, 
  int dstHeight, boolean filter)——以src为原图,创建新的图像,指定新图像的高宽以及是否可变。 
  public static Bitmap createBitmap(int width, int height, Config config)——创建指定格式、大小的位图 
  public static Bitmap createBitmap(Bitmap source, int x, int y, int width, int height)以source为原图,创建新的图片,指定起始坐标以及新图像的高宽。 
2. BitmapFactory工厂类:
  Option 参数类: 
    public boolean inJustDecodeBounds——如果设置为true,不获取图片,不分配内存,但会返回图片的高度宽度信息。 
    public int inSampleSize——图片缩放的倍数。如果设为4,则宽和高都为原来的1/4,则图是原来的1/16。 
    public int outWidth——获取图片的宽度值 
    public int outHeight——获取图片的高度值 
    public int inDensity——用于位图的像素压缩比 
    public int inTargetDensity——用于目标位图的像素压缩比(要生成的位图) 
    public boolean inScaled——设置为true时进行图片压缩,从inDensity到inTargetDensity。

使用BitmapFactory 可从资源files, streams, and byte-arrays中解码生成Bitmap对象。
读取一个文件路径得到一个位图。如果指定文件为空或者不能解码成文件,则返回NULL。 
public static Bitmap decodeFile(String pathName, Options opts) 
public static Bitmap decodeFile(String pathName) 
读取一个资源文件得到一个位图。如果位图数据不能被解码,或者opts参数只请求大小信息时,则返回NuLL。 
(即当Options.inJustDecodeBounds=true,只请求图片的大小信息。) 
public static Bitmap decodeResource(Resources res, int id) 
public static Bitmap decodeResource(Resources res, int id, Options opts) 
从输入流中解码位图 
public static Bitmap decodeStream(InputStream is) 
从字节数组中解码生成不可变的位图 
public static Bitmap decodeByteArray(byte[] data, int offset, int length)

BitmapDrawable类:继承于Drawable,你可以从文件路径、输入流、XML文件以及Bitmap中创建。 
常用的构造函数: 
Resources res=getResources();//获取资源 
public BitmapDrawable(Resources res)——创建一个空的drawable。(Response用来指定初始时所用的像素密度)替代public BitmapDrawable()方法(此方法不处理像素密度) 
public BitmapDrawable(Resources res, Bitmap bitmap)——Create drawable from a bitmap 
public BitmapDrawable(Resources res, String filepath)——Create a drawable by opening a given file path and decoding the bitmap. 
public BitmapDrawable(Resources res, java.io.InputStream is)——Create a drawable by decoding a bitmap from the given input stream.

BitMap通过网络连接获取图片例子:

  1 package com.example.bitmaodemo;
  2
  3 import java.io.IOException;
  4 import java.io.InputStream;
  5 import java.net.HttpURLConnection;
  6 import java.net.MalformedURLException;
  7 import java.net.URL;
  8
  9 import android.app.Activity;
 10 import android.graphics.Bitmap;
 11 import android.graphics.BitmapFactory;
 12 import android.os.Bundle;
 13 import android.os.Handler;
 14 import android.os.Message;
 15 import android.util.Log;
 16 import android.view.View;
 17 import android.view.View.OnClickListener;
 18 import android.widget.Button;
 19 import android.widget.ImageView;
 20 import android.widget.Toast;
 21
 22 public class MainActivity extends Activity {
 23     private Thread tr;
 24     private Bitmap bitmap;
 25     private Runnable run;
 26
 27     private Button btn;
 28     private ImageView iv;
 29     private Handler handler;
 30
 31     //图片的路径,百度随便一张即可
 32     private static final String url_img = "http://p4.music.126.net/UVauLiOkCCNWR-XBMIDawg==/3437073360051219.jpg";
 33
 34     @Override
 35     protected void onCreate(Bundle savedInstanceState) {
 36         super.onCreate(savedInstanceState);
 37         setContentView(R.layout.activity_main);
 38
 39         btn = (Button) findViewById(R.id.btn);
 40         iv = (ImageView) findViewById(R.id.imageView1);
 41
 42         btn.setOnClickListener(new OnClickListener() {
 43
 44             @Override
 45             public void onClick(View arg0) {
 46                 // 获取一个新的线程,当点击按钮的时候将图下载下来
 47                 new Thread(new Runnable() {
 48
 49                     @Override
 50                     public void run() {
 51                         try {
 52                             // 获取图片的路径
 53                             URL url = new URL(url_img);
 54                             // 创建一个网络连接
 55                             HttpURLConnection conn = (HttpURLConnection) url
 56                                     .openConnection();
 57                             conn.connect();
 58                             // 获取一个输入流,读取上面网络连接的信息
 59                             InputStream is = conn.getInputStream();
 60                             if (is != null) {
 61                                 Log.i("info", "----------------");
 62                                 /*
 63                                  * 使用BitmapFactory 可从资源files, streams, and byte-arrays中解码生成Bitmap对象。
 64                                  *读取一个文件路径得到一个位图。如果指定文件为空或者不能解码成文件,则返回NULL。
 65                                  */
 66                                 bitmap = BitmapFactory.decodeStream(is);
 67                             }
 68
 69                             Message message = new Message();
 70                             message.obj = bitmap;
 71                             message.what = 0;
 72                             //向handler发送信息,可以跟新UI了
 73                             handler.sendMessage(message);
 74
 75                         } catch (MalformedURLException e) {
 76                             // TODO Auto-generated catch block
 77                             e.printStackTrace();
 78                         } catch (IOException e) {
 79                             // TODO Auto-generated catch block
 80                             e.printStackTrace();
 81                         }
 82
 83                     }
 84
 85                 }).start();
 86             }
 87         });
 88
 89         handler = new Handler() {
 90             @Override
 91             public void handleMessage(Message msg) {
 92                 switch (msg.what) {
 93                 case 0:
 94                     Log.i("info", "ss" + msg.obj);
 95                     iv.setImageBitmap((Bitmap) msg.obj);
 96                     break;
 97                 }
 98             }
 99         };
100
101     }
102 }

由于BitMap是不能在主线程中运行的,所以我们需要用其他线程来执行对图片的读取。

结果:

点击按钮后:

时间: 12-06

Android菜鸟成长记15 -- BitMap的相关文章

Android菜鸟成长记9 -- selector的用法

在项目开发的时候,由于系统给出的控件不够美观,因此开发时领导常常要我更改下界面,用美工给的图片取代系统图片.开始时,我只是给按钮等设置一下背景图片,这样做虽然美观了,但界面看起来却比较死板,比如用户点击了按钮后,按钮没一点反应.于是我就再给控件添加上onTouch监听事件,按下后改变背景颜色,松手后再恢复原来颜色.但后来发现了selector这个利器,真是喜出望外,不用再添加onTouch监听事件了,用起来也方便灵活.不得不说,多和其他开发人员交流技术经验等还是很有必要的,特别是像我这样独自负责

Android菜鸟成长记8 -- 布局实践(微信界面的编写)

前面我们简单的介绍了一下android的五大布局,那么现在我们来实践一下,写一个简单的微信界面 首先,我们新建一个weixin.xml的linnerlayout布局 我们日常使用的微信,从简单的方面来说我可一分成三个内容,头部标签栏,中间显示信息栏,还有一个底部.那么我们就按照这个来先建一个页面 1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="

Android菜鸟成长记12 -- ORMLite的简单使用

在我们的开发中,为了提高开发效率,我们一般都会使用到框架,ormilte则是我们必不可少的数据库框架. 对于ORMLite我也是今天才刚刚接触,我们先从一个简单的项目来了解它吧. ORMLite jar 要想使用ormlite,我们要先下载其jar包. 下载方法: 我们可以到官网去下载:http://ormlite.com/releases/ 下载的时候,我们要下载一个core的jar和android的jar,本人用的是ormlite-android-5.0.jar和ormlite-core-5

Android菜鸟成长记11 -- sqlite数据库的设计和升降级

Google为Andriod的较大的数据处理提供了SQLite,他在数据存储.管理.维护等各方面都相当出色,功能也非常的强大.SQLite具备下列特点: 1.轻量级 使用 SQLite 只需要带一个动态库,就可以享受它的全部功能,而且那个动态库的尺寸想当小. 2.独立性 SQLite 数据库的核心引擎不需要依赖第三方软件,也不需要所谓的"安装". 3.隔离性 SQLite 数据库中所有的信息(比如表.视图.触发器等)都包含在一个文件夹内,方便管理和维护. 4.跨平台 SQLite 目前

Android菜鸟成长记1 -- JSON的解析

JSON的定义  一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性.业内主流技术为其提供了完整的解决方案(有点类似于正则表达式 ,获得了当今大部分语言的支持),从而可以在不同平台间进行数据交换.JSON采用兼容性很高的文本格式,同时也具备类似于C语言体系的行为. android提供的json解析类 android的json解析部分都在包org.json下,主要有以下几个类: JSONObject:可以看作是一个json对象,这是系统中有关JSON定义的基本单元,其包含一对儿(Key/

Android菜鸟成长记5-ADB和sqllite

Android开发环境中,ADB是我们进行Android开发经常要用的调试工具,它的使用当然是我们Android开发者必须要掌握的. ADB概述 Android Debug Bridge,Android调试桥接器,简称adb,是用于管理模拟器或真机状态的万能工具,采用了客户端-服务器模型,包括三个部分: 1.客户端部分,运行在开发用的电脑上,可以在命令行中运行adb命令来调用该客户端,像ADB插件和DDMS这样的Android工具也可以调用adb客户端. 2.服务端部分,是运行在开发用电脑上的后

菜鸟成长记1,软件工程大一经历

菜鸟成长记1 -----大一总结及反思 大一即将结束,突然间想总结一下我的大一生活,最重要的还是好好反思一下. 回首整个大一感觉自己学了好多的东西,但最终的感觉还是一无所成,大一上学期学习c语言,一直处于一个总是一个没有入门的感觉,虽然简单的c经长期磨练已经差不多搞懂,不过稍微复杂点的抑或着说稍微麻烦点的都没有真正学会,仅仅是学过c而已,在学c的同时一直想练ACM可能真的是天赋不够也可能是自己不是这块料,在几经折磨下,做了uva上不超过30道题的情况下放弃了,除想练ACM这中间还接触了java和

[菜鸟成长记]iOS开发自学笔记01-向helloworld致敬

我有一个梦想就是成为一个iOS开发.........菜鸟,老规矩,一切从helloworld开始. iOS8伴随着iphone6/6plus而来,Xcode6伴随着iOS8而来,苹果更新换代的速度依然很快,从硬件到软件,每次更新就意味着开发者们又要面临着一次次的恶补,当然,像我这样励志成为iOS开发菜鸟的人来说,目前还没有到面临这些问题的烦恼,我只需要专心做好我的hello world小程序,就像我从前无数次地在其他平台一样. 首先打开Xcode后从模板中选择single view applic

菜鸟成长记

突然才发现,昨天(20-03-2016)刚好是自己入圆5周年.时间一下子回到了之前,刚刚入圆的那一天(20-03-2011). 记得那天注册,是在大学宿舍的晚上,天开始变得模模糊糊的时候.还清楚的记得,那个时候自己还在自学jsp&servlet! 菜鸟,对于那个时候的我来说,再没有更好的称呼了. 我想谈谈我自己的一些经历,和大家分享一下.如果你觉得好听,或者受用,那么也就达到了我的目的.如果你觉得没什么意思,或者说收获不多,那么就当做杂文一扫而过也无妨.之前有网友发消息给我说:希望我给她一些指导