安卓BitmapFactory处理图片

一,Bitmap基本概念:

1.bitmap是Android系统中的图像处理的重要类之一;

2.通过bitmap我们可以获取到图片的相关信息;

3.bitmap文件图像效果好就需要占用越大存储空间;

二,Bitmap的加载方式:
1.BitmapFactory.decodeBetyArray();//字节数组

2.BitmapFactory.decodeFile();//文件路径

3.BitmapFactory.decodeResource();//资源ID

4.BitmapFactory.decodeStream();//流

Bitmap不做处理的加载方式:
Bitmap bitmap = BitmapFactory.decodeResource(getResources,R.drawable.ic_launcher,null);
//最后一个参数是BitmapFactory.Options,bitmap的高效处理就是通过BitmapFactory.Options来设置的

三,BitmapFactory.Options的作用:

1.防止内存溢出;

2.节省内存开销;

3.系统更流畅;

四,BitmapFactory.Options的重要属性:

1.injustDecodeBounds;

*设为true,那么BitmapFactory并不会真的返回一个Bitmap给你,它仅仅会把它的宽,高取回来给你,这样就不会占用太多的内存,也就不会那么频繁的发生OOM。

*设置为false,BitmapFactory返回bitmap;

2.outWidth&outHeight;

*bitmap图像的宽和高;

3.inSampleSize;

获取采样率

*inSampleSize大于1时,图像高、宽分别以2的inSampleSize次方分之一缩小

*inSampleSize小于等于1时,图像高、宽不变;

4.inpreferredConfig:

*ALPHA_8: 每个像素用占8位,存储的是图像的透明值,占1个字节;

*RGB_565:每个像素用占16位,分别为5-R,6-G,5-B通道,占2个字节;

*ARGB-4444:每个像素占16位,即每个通道用4位表示,占2个字节;

*ARGB_8888:每个像素占32位,每个通道用8位表示,占4个字节;

5.inDither:

*是否进行图像抖动处理;

6.inMutable:

*如果设置为true,将返回一个mutable的bitmap,可用于修改BitmapFactory加载而来的bitmap.

7.inScale:

*是否需要放缩位图

BitmapFactory.options的实际应用:

    String pathName = "/storage/emulated/0/test1.jpg";
    //width: 263,ImageView实际比较小
    int width = mIv.getWidth();

    int height = mIv.getHeight();

    Log.d(TAG, "imageView width: "+width);
    //不采样时图片的大小:9216000
    Bitmap bitmap = BitmapFactory.decodeFile(pathName);
    Log.d(TAG, "不二次采样bitmap大小: "+bitmap.getAllocationByteCount());
    BitmapFactory.Options options = new BitmapFactory.Options();
    //设置为true,加载图片时不会获取到bitmap对象,但是可以拿到图片的宽高
    options.inJustDecodeBounds = true;
    BitmapFactory.decodeFile(pathName,options);
   //计算采样率,对图片进行相应的缩放
    int outWidth = options.outWidth;
    int outHeight = options.outHeight;
    Log.d(TAG, "outWidth: "+outWidth+",outHeight:"+outHeight);
    float widthRatio = outWidth*1.0f/width;
    float heightRatio = outHeight*1.0f/height;
    Log.d(TAG, "widthRatio: "+widthRatio+",heightRatio:"+heightRatio);
    float max = Math.max(widthRatio, heightRatio);
    //向上舍入
    int inSampleSize = (int) Math.ceil(max);
    Log.d(TAG, "inSampleSize: "+inSampleSize);
    //改为false,因为要获取采样后的图片了
    options.inJustDecodeBounds = false;
    options.inSampleSize = inSampleSize;
    Bitmap bitmap1 = BitmapFactory.decodeFile(pathName, options);
    //采样后图片大小:144000,是采样前图片的inSampleSize*inSampleSize分之一(1/64)
    Log.d(TAG, "二次采样bitmap大小: "+bitmap1.getAllocationByteCount());
    mIv.setImageBitmap(bitmap1);
微信图片_20190319160124.jpg

点个赞再走呗

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 2021期待与你一起共事,点击查看岗位[https://www.jianshu.com/p/6f4d67fa406...
    闲庭阅读 16,803评论 0 75
  • 目录介绍 01.如何计算Bitmap占用内存1.1 如何计算占用内存1.2 上面方法计算内存对吗1.3 一个像素占...
    杨充211阅读 9,769评论 1 9
  • 一直以来Bitmap都是开发中很棘手的问题,这个问题就是传说中的OOM(java.lang.OutofMemory...
    M悇芐冋忆阅读 10,321评论 0 11
  • 图片压缩就是为了避免我们内存溢出,所有要对一系列进行压缩二次采样等 1.什么是OOM?为什么会引起OOM? out...
    lay_wn阅读 4,533评论 0 1
  • 非原创,只是整理,如果里面发现引用的内容没有标识出来,欢迎指出。 一、基本知识 (1)两种图片: 1)矢量图: 矢...
    风再起时ME阅读 7,202评论 0 19