Android知识点总结(十九)android Bitmap,BitmapFactory,BitmapFactory.Options

相关文章:

Android 知识点总结(目录) https://blog.csdn.net/a136447572/article/details/81027701

Bitmap

1.当使用ImageView的时候,可能图片的像素大于ImageView,此时就可以通过BitmapFactory.Option来对图片进行压缩,inSampleSize表示缩小2^(inSampleSize-1)倍。
2.BitMap的缓存:
1.使用LruCache进行内存缓存。
2.使用DiskLruCache进行硬盘缓存。
3.实现一个ImageLoader的流程:同步异步加载、图片压缩、内存硬盘缓存、网络拉取
1.同步加载只创建一个线程然后按照顺序进行图片加载
2.异步加载使用线程池,让存在的加载任务都处于不同线程
3.为了不开启过多的异步任务,只在列表静止的时候开启图片加载

一、基本信息
Bitmap位图包括像素以及长、宽、颜色等描述信息。长宽和像素位数是用来描述图片的,可以通过这些信息计算出图片的像素占用内存的大小。

  1. Config:表示图片像素类型,包括ALPHA_8、RGB_565、ARGB_4444、ARGB_8888 A:透明度;RGB分别是Red、Green、Blue,三种原色
    ARGB_8888:四个通道都是8位,每个像素占用4个字节,图片质量是最高的,但是占用的内存也是最大的;

ARGB_4444:四个通道都是4位,每个像素占用2个字节,图片的失真比较严重;

RGB_565:没有A通道,每个像素占用2个字节,图片失真小,但是没有透明度;

ALPHA_8:只有A通道,每个像素占用1个字节大大小,只有透明度,没有颜色值。

使用场景总结:ARGB_4444失真严重,基本不用;ALPHA_8使用场景特殊,比如设置遮盖效果等;不需要设置透明度,RGB_565是个不错的选择;既要设置透明度,对图片质量要求又高,就用ARGB_8888。

  1. CompressFormat:Bitmap.CompressFormat.JPEG、Bitmap.CompressFormat.PNG、Bitmap.CompressFormat.WEBP三种压缩格式
    JPEG:一种有损压缩(JPEG2000既可以有损也可以无损),”.jpg”或者”.jpeg”; 优点:采用了直接色,有丰富的色彩,适合存储照片和生动图像效果;缺点:有损,不适合用来存储logo、线框类图。

PNG: 一种无损压缩,”.png”; 优点:支持透明、无损,主要用于小图标,透明背景等;缺点:若色彩复杂,则图片生成后文件很大;

WEBP:以WebP算法进行压缩;Google开发的新的图片格式,同时支持无损和有损压缩,使用直接色。无损压缩,相同质量的webp比PNG小大约26%;有损压缩,相同质量的webp比JPEG小25%-34% 支持动图,基本取代gif

二、加载
BitmapFactory提供了四类方法:decodeFile、decodeResource、decodeStream、decodeByteArray

        //从文件中读取
        try {
            FileInputStream in = new FileInputStream("/sdcard/......");
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }

        Bitmap bitmap = BitmapFactory.decodeStream(in);

        Bitmap bitmap2 = BitmapFactory.decodeFile("/sdcard/.......");

        //从资源中读取
        Bitmap bp3 = BitmapFactory.decodeResource(getResources(),R.drawable.ic_launcher_background);

        //从字节序列里读取
        byte[] bytes  = new byte[1024];//通过其他InputStream 装换成byte[]
        Bitmap bp4 = BitmapFactory.decodeByteArray(bytes,0,bytes.length);

BitmapFactory.Options

inJustDecodeBounds为true,不返回bitmap,只返回这个bitmap的尺寸

BitmapFactory.Options options = new BitmapFactory.Options();
//inJustDecodeBounds为true,不返回bitmap,只返回这个bitmap的尺寸  
options.inJustDecodeBounds = true;
BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher_background, options);
int imageHeight = options.outHeight;
int imageWidth = options.outWidth;
String imageType = options.outMimeType;

inSampleSize

采样率,设置它,可以缩放图片。官方建议取值为2的幂数,比如1、2、4、8、16等。例如,当设置inSampleSize=1时,采样后的图片大小为图片的原始大小;inSampleSize大于1时,比如2,那么采样后的图片宽/高均为原图大小的1/2,总像素为原图的1/4,其占用内存也为原图的1/4,例如一张1024*1024的像素图片,假如采用ARGB_8888格式存储,它占用的内存大小大约是=1024*1024*4=4MB。如果inSampleSize=2,那么采样后的图片其内存占用是512*512*4=1MB。如果inSampleSize小于1,则按1处理;其他任何值将四舍五入到最接近2的幂数!我们可以动态计算inSampleSize的值,如下所示,

options.inSampleSize = 1 ;
BitmapFactory.Options options = new BitmapFactory.Options();  
//inJustDecodeBounds为true,不返回bitmap,只返回这个bitmap的尺寸  
options.inJustDecodeBounds = true; 
BitmapFactory.decodeResource(getResources(), images[position], options);  
//利用返回的原图片的宽高,我们就可以计算出缩放比inSampleSize(只能是2的整数次幂)
options.inSampleSize = caluelateInSampleSize(options, reqWidth, reqHeight);//使用RGB_565减少图片大小  
options.inPreferredConfig = Bitmap.Config.RGB_565;  
//释放内存,共享引用(21版本后失效)  
options.inPurgeable = true;  
options.inInputShareable = true;  

//inJustDecodeBounds为false,返回bitmap  
options.inJustDecodeBounds = false;  
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), images[position], options);  
private int calculateSampleSize(BitmapFactory.Options options,int reqWidth,int reqHeight){int width = options.outWidth;
    int height =options.outHeight;int inSampleSize = 1;
    int halfWidth = width / 2;
    int halfHeight = height / 2;
    while((halfWidth / inSampleSize) >= reqWidth && (halfHeight / inSampleSize) >= reqHeight){
        inSampleSize *= 2;
    }
    return inSampleSize;
}

转自 Bitmap类用法 详细说明> https://blog.csdn.net/ymangu666/article/details/37729109

1. BitMap类
public void recycle()——回收位图占用的内存空间,把位图标记为Dead
public final boolean isRecycled() ——判断位图内存是否已释放
public final int getWidth()——获取位图的宽度
public final int getHeight()——获取位图的高度
public final boolean isMutable()——图片是否可修改
public int getScaledWidth(Canvas canvas)——获取指定密度转换后的图像的宽度
public int getScaledHeight(Canvas canvas)——获取指定密度转换后的图像的高度
public boolean compress(CompressFormat format, int quality, OutputStream stream)——按指定的图片格式以及画质,将图片转换为输出流。
format:Bitmap.CompressFormat.PNG或Bitmap.CompressFormat.JPEG
quality:画质,0-100.0表示最低画质压缩,100以最高画质压缩。对于PNG等无损格式的图片,会忽略此项设置。

常用的静态方法:
public static Bitmap createBitmap(Bitmap src) ——以src为原图生成不可变得新图像
public static Bitmap createScaledBitmap(Bitmap src, int dstWidth,
int dstHeight, boolean filter)——以src为原图,创建新的图像,指定新图像的高宽以及是否可变。
public static Bitmap createBitmap(int width, int height, Config config)——创建指定格式、大小的位图
public static Bitmap createBitmap(Bitmap source, int x, int y, int width, int height)以source为原图,创建新的图片,指定起始坐标以及新图像的高宽。

2. BitmapFactory工厂类:
Option 参数类:
public boolean inJustDecodeBounds——如果设置为true,不获取图片,不分配内存,但会返回图片的高度宽度信息。
public int inSampleSize——图片缩放的倍数。如果设为4,则宽和高都为原来的1/4,则图是原来的1/16。
public int outWidth——获取图片的宽度值
public int outHeight——获取图片的高度值
public int inDensity——用于位图的像素压缩比
public int inTargetDensity——用于目标位图的像素压缩比(要生成的位图)
public boolean inScaled——设置为true时进行图片压缩,从inDensity到inTargetDensity。

使用BitmapFactory 可从资源files, streams, and byte-arrays中解码生成Bitmap对象。
读取一个文件路径得到一个位图。如果指定文件为空或者不能解码成文件,则返回NULL。
public static Bitmap decodeFile(String pathName, Options opts)
public static Bitmap decodeFile(String pathName)
读取一个资源文件得到一个位图。如果位图数据不能被解码,或者opts参数只请求大小信息时,则返回NuLL。
(即当Options.inJustDecodeBounds=true,只请求图片的大小信息。)
public static Bitmap decodeResource(Resources res, int id)
public static Bitmap decodeResource(Resources res, int id, Options opts)
从输入流中解码位图
public static Bitmap decodeStream(InputStream is)
从字节数组中解码生成不可变的位图
public static Bitmap decodeByteArray(byte[] data, int offset, int length)

BitmapDrawable类:继承于Drawable,你可以从文件路径、输入流、XML文件以及Bitmap中创建。
常用的构造函数:
Resources res=getResources();//获取资源
public BitmapDrawable(Resources res)——创建一个空的drawable。(Response用来指定初始时所用的像素密度)替代public BitmapDrawable()方法(此方法不处理像素密度)
public BitmapDrawable(Resources res, Bitmap bitmap)——Create drawable from a bitmap
public BitmapDrawable(Resources res, String filepath)——Create a drawable by opening a given file path and decoding the bitmap.
public BitmapDrawable(Resources res, java.io.InputStream is)——Create a drawable by decoding a bitmap from the given input stream.

你可能感兴趣的:(andriod)