zoukankan      html  css  js  c++  java
  • Bitmap(一)

      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!~~

  • 相关阅读:
    Spring中 @PathVariable
    消息队列中点对点与发布订阅区别
    rabbitMQ下载地址
    当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?
    String和StringBuilder、StringBuffer的区别?
    char 型变量中能不能存贮一个中文汉字,为什么?
    抽象类(abstract class)和接口(interface)有什么异同?
    静态嵌套类(Static Nested Class)和内部类(Inner Class)的不同?
    抽象的(abstract)方法是否可同时是静态的(static),是否可同时是本地方法(native),是否可同时被synchronized修饰?
    阐述静态变量和实例变量的区别。
  • 原文地址:https://www.cnblogs.com/fishbone-lsy/p/4486571.html
Copyright © 2011-2022 走看看