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

  • 相关阅读:
    如何更改AD域安全策略-密码必须符合复杂性要求
    Flameshot:一个简洁但功能丰富的截图工具
    Linux桌面最轻量的Dock之Plank介绍
    NVIDIA vGPU License服务器搭建详解
    阿姜查 | 当一个人不了解死亡时,生活会非常烦恼
    阿姜查:工作永远没完没了 你为何着急做完?
    .NET 通用高扩展性的细粒度权限管理架构(webApi/Mvc)
    WebApi实现通讯加密 (转)
    MVC
    程序员的沟通之痛
  • 原文地址:https://www.cnblogs.com/fishbone-lsy/p/4486571.html
Copyright © 2020-2023  润新知