Android图片使用之Bitmap详解

转载请注明出处:http://blog.csdn.net/hlm2016

        Android动画之Bitmap

        在Android开发中,当你需要在见面中呈现图片时,经常需要用到ImageView来作为载体。虽然我们是要做一个动画,但还是可以用ImageView来承载。因为按照动画的播放,我们只要能让ImageView的占位图片不断发生变化或替换,就能实现形如GIF一样的动画效果了!那么要让ImageView实现图片加载,那我们就需要一个辅助类Bitmap来帮忙来,也就是我们这一节的重头戏啦(我们这里指的是程序运行时从手机图库或者文件中获取的图片,由用户自己来指定加载的图片,也就是说在接下来的文章中我会教大家如何获取系统图库并从中加载需要的图片,有空的同学可以先学习下Intent的用法,当然到时也会一起讲的,敬请期待!)

        说到Bitmap与ImageView,相信大家已经有所听闻,甚至个别朋友已经相当熟练,但是技术不嫌新,知识不怕多呀!所以在这一篇文章中,我不仅会顾及初学者对此的了解,同时会加入一些关于这两个类的进阶使用。

        为什么要在这里先讲Bitmap与ImageView呢?!其实很简单,在我开发的--动画SDK--AnimationForAndroid中经常要用到的就是这两个了,甚至是两者结合使用,实现更强大的动画效果!那么如何学习这两个重头戏呢,我今天还是打算先讲Bitmap,怕太多知识点大家一时接受不了!

 

1.Bitmap

    简介:这是一个Android自带的图片操作工具类。使用这个类,我们可以对一张图片进行一些操作了,比如,图片画质的配置、图片透明度的大小,等等。但是这个类并无法进行自身的实例化,只能依靠一个辅助类来创建一个Bitmap实例,那就是BitmapFactory类。因为此类在定义时构造函数都必须传入一个Bitmap实例,所以无法用此类直接实例Bitmap,下面自然会教大家如何实例此类的

    外部可调用的方法:(来自Bitmap.class文件)

public int getDensity() {}//获取图片像素密度
public void setDensity(int density) {}//设置图片像素密度
public void reconfigure(int width, int height, android.graphics.Bitmap.Config config) {}
//对图片进行重新设置
public void setWidth(int width) {}//设置宽度
public void setHeight(int height) {}//设置高度
public void setConfig(android.graphics.Bitmap.Config config) {}//设置已生成的配置config
public void recycle() {}//
public final boolean isRecycled() {}

public boolean compress(android.graphics.Bitmap.CompressFormat formatint, 
int quality, java.io.OutputStream stream) {}//将图片另存,见下文详解

public final int getWidth() {}
public final int getHeight() {}
//Scale是缩放的意思,也就是说看到Scale就可以判断这是用来指定图片缩放倍数的
public int getScaledWidth(android.graphics.Canvas canvas) {}
public int getScaledHeight(android.graphics.Canvas canvas) {}
public int getScaledWidth(android.util.DisplayMetrics metrics) {}
public int getScaledHeight(android.util.DisplayMetrics metrics) {}
public int getScaledWidth(int targetDensity) {}
public int getScaledHeight(int targetDensity) {}

public final int getByteCount() {}//获取图片的字节数

public final android.graphics.Bitmap.Config getConfig() {}//获取当前图片的配置内容

public boolean sameAs(android.graphics.Bitmap other) {}//将当前图片转换成传入的other参数

public void prepareToDraw() {

接下来的这一部分是Bitmap类中的枚举:

 

   /**
     * Bitmap 保存图片时指定格式
     */
    public static final enum CompressFormat
    {
        JPEG,
        PNG,
        WEBP,
        ;
    }
    /**
     * Bitmap的配置
     * 指定Biymap的透明度和颜色配比等
     */
    public static final enum Config
    {
        ALPHA_8,
        ARGB_4444,
        ARGB_8888,
        RGB_565,
        ;
    }

 

在这些方法与枚举里面有很多值得我们研究的东西了,接下来就让我带大家来领略一下这个神奇的Bitmap类吧!

@如何实例化Bitmap ,请看代码

1. InputStream mIn=new FileInputStream("Bitmap.jpg"); 
       Bitmap mBit = new BitmapFactor().decodeStream(mIn);
2. Bitmap mBit = new BitmapFactor().decodeFile("http//csdn.blog.com/hlm520/Bitmap.jpg");

正如上面代码所呈现的,实例化Bitmap其实有不同的方式,但偏偏就不能由Bitmap这个类来获取实例,而是通过BitmapFactory来实现的。显而易见Factory意思就是加工厂的意思,也就是说我们可以通过这个类进行Bitmap的大部分操作。那么代码中有两个部分:第一部分,我们先通过实例一个InputStream获得一个输入流,而这个流持有我们想要的图片,那么只要把这个流传入decodeStream( )中就可以对这个流进行解析,从而得到对应的Bitmap实例,注意这时候的Bitmap已经是一个持有图片的类了,这时就可以与ImageView结合使其在ImageView中呈现了,不过这部分可是下节的内容哦!;第二部分,同样是一个实例Bitmap的例子,不过这时没有了流,直接传入图片地址就行了。不过从执行效率来看本人建议使用流的那个方法!!!

@如何将获得的Bitmap另存至指定文件夹,同样先看代码

1. InputStream mIn=new FileInputStream("Bitmap.jpg");//这里需要捕抓异常,加个try  catch
   Bitmap mBit = new BitmapFactor().decodeStream(mIn);
   if(mBit!=null)
     {
      Bitmap.CompressFormat  mBC=new Bitmap().CompressFormat.PNG;
      OutputStream mOut=new OutputStream("hlm2016.png");
      mBit.compres(mBC,50,mOut) ;
      mOut.flush();
      mOut.close();
     }

在这段代码中我们同样获得一个Bitmap实例,然后如果mBit不为空,则开始图片另存的操作,首先获得一个图片的保存格式为PNG,这里就使用到了CompressFormat这个内部枚举,其实还可以是JPEG或WEBP格式。不过最好用WEBP吧,因为它可以进行无损压缩,也是网络图片传输经常用到的;然后我们获得一个输出流,这个流指定了图片要保存的地址,同时为图片的快速存储提供可能性,亲测流技术相当快!然后,就是将实例过的mBit作为输出对象,调用compress方法,传入参数依次是(图片格式Format,图片质量 quality,输出流 stream),在最后我们将整个流刷新后清空,这时图片就被存入指定文件中了,是不是很简单呢!

其实还可以对Bitmap进行一些更高级的配置,不过担心大家喘不过气今天就先休息休息吧!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章