Bitmap,是android为开发者提供的图像处理。我把它想象成一个PS软件。以某种方式获取一张图,对它进行处理(包括缩放、裁剪、旋转等等),然后再把这个图以某种方式输出,显示或形成文件流等等。用完之后一定要记得关掉(回收)PS(Bitmap)。因为就像PS一样,Bitmap是很吃内存的。同时开两个PS电脑会卡爆,Bitmap也会让App产生OOM。

  Bitmap的API太多,所以,我决定用这个博客,将我所见到的,尝试的好例子,都搬上来,方便自己以后在不会写时过来翻一翻。同时也是因为,网上带坑的Bitmap例子实在太多,我在这里做一个愚公移山的过滤  。

  第一段先转田海立老师的一篇博客  http://blog.csdn.net/thl789/article/details/6762030

  这篇博客为我对Bitmap的初始认知打下了基础。

  

一、Bitmap的生成

1.1 BitmapFactory decode出Bitmap

    Bitmap实现在android.graphics包中。但是Bitmap类的构造函数是私有的,外面并不能实例化,只能是通过JNI实例化。这必然是某个辅助类提供了创建Bitmap的接口,而这个类的实现通过JNI接口来实例化Bitmap的,这个类就是BitmapFactory。

  

  如上图可以看到,BitmapFactory可以有如上几种方法创建Bitmap并获取图片。

  大致分个类有5种:

  1、InputStream

  2、FileDescriptor 

  3、String(pathName)

  4、byte[]

  5、Resources

  其中,除了第2个都挺容易理解是什么东西的。第2个通常查阅得,通俗地来说,它是一个文件描述。每当开发者创造一个文件流,这个文件描述就伴随而生了。开发者可以用.getFD();方法获取这个对象。它的真正作用是对系统平台 file descriptor 的封装,Java 中的 System.out, System.err, System.in 就是通过这个来获得操作系统对应的句柄。

  在此,只介绍几种比较常用的获取方法。

  1)InputStream:

        String pathName = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "Download/59e58PICyB8.jpg";
        try{
            Log.d("tag","获取文件流");
            file = new File(pathName);
            inputStream = new FileInputStream(file);
            bitmap = BitmapFactory.decodeStream(inputStream);
        }catch (Exception e){
           e.printStackTrace();
        }finally {
            try {
                inputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

  2)String(pathName)

        String pathName = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "Download/59e58PICyB8.jpg";
        try{
            file = new File(pathName);
            inputStream = new FileInputStream(file);
            bitmap = BitmapFactory.decodeStream(inputStream);
        }catch (Exception e){

        }finally {
            try {
                inputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

  3)Resources  

        bitmap = BitmapFactory.decodeResource(getResources() , R.drawable.ic_launcher);

  4)Asset

  Asset中的文件用的还是输入文件流的办法,只需要将Asset中的文件转化成输入流,输入到bitmap工厂中生成bitmap即可。

        AssetManager am = getAssets();
        try {
            InputStream inputStream1 = am.open("qqimage.jpg");
            bitmap = BitmapFactory.decodeStream(inputStream1);
        } catch (IOException e) {
            e.printStackTrace();
        }

  先这样!Duang!~~

posted on 2015-05-08 00:41  Fishbonell  阅读(210)  评论(0编辑  收藏  举报