学习资料:
android 开发艺术探索
1.关于 Bitmap
在Android中Bitamp指的就是一张图片,一般是png和jpeg格式。
Bitmap类中有一个enum类型的Config,其中有4个值
ALPHA_8
8位位图;1 个字节,只有透明度,没有颜色值
RGB_565
16位位图;2 个字节,r = 5,g = 6,b = 5,一个像素点 5+6+5 = 16
ARGB_4444
16位位图;2 个字节,a = 4,r = 4,g = 4,b = 4,一个像素点 4+4+4+4 = 16
ARGB_8888
32 位位图; 4个字节,a = 8,r = 8,g = 8, b = 8,一个像素点 8 + 8 + 8 + 8 = 32
每8位一个字节
并不理解a,r,g,b对像素的影响,主要了解一下,不同的类型格式,占用内存情况
一张 1024 * 1024 像素,采用ARGB8888格式,一个像素32位,每个像素就是4字节,占有内存就是4M
若采用RGB565,一个像素16位,每个像素就是2字节,占有内存就是2M
Glide加载图片默认格式RGB565,Picasso为ARGB8888,默认情况下,Glide占用内存会比Picasso低,色彩不如Picasso鲜艳,自然清晰度就低
BitmaFactory
Creates Bitmap objects from various sources, including files, streams, and byte-arrays.
通过BitmapFactory从文件系统,资源,输入流,字节数组中加载得到一个Bitmap对象。
decodeByteArray()
decodeFile()
decodeResource()
decodeStream()
decodeFileDescriptor()
decodeResourceStream()
BitmapFactory所有public method都是静态方法。一共也就6个方法,后两个用的几率不如前4个高 :)
2.Bitmap 的高效加载
核心思想: 利用BitmapFactory.Options来加载实际所需的尺寸
2.1 BitmapFactory.Options
这个类中只有一个方法requestCancelDecode(),剩下全是一些常量值
BitmapFactory.Options缩放图片主要用到inSample采样率
inSample = 1,采样后图片的宽高为原始宽高
inSample > 1,例如2,宽高均为原图的宽高的1/2
一个采用ARGB8888的1024 * 1024 的图片
inSample = 1,占用内存就 1024 * 1024 * 4 = 4M
inSample = 2,占用内存就 512 * 512 * 4 = 1M
缩小规律就是:1 /(inSample ^ 2)
inSample的值最小为1,低于1时无效的。inSample的值最好为2,4,8,16,2的指数。在某些时候,系统会向下取整,例如为3时,系统会用2来代替。2 的指数,可以一定程度上避免图片拉伸变形。
2.2 获取采样率的流程
以读取资源文件为例:
创建BitmapFactory.Options对象options
将options的inJustDecodeBounds参数设为true,然后使用BitmapFactory.decodeResource(res,resId,options)加载图片
利用options取出图片的原始宽高信息,outWidth,outHeight
根据采样率的规则并结合实际需要显示的宽高计算出inSample
将options的inJustDecodeBounds参数设为false,并再次使用BitmapFactory.decodeResource(res,resId,options)返回采样后的Bitmap
inJustDecodeBounds设为true,BitmapFactory只会解析图片的原始信息,并不会真正的加载图片
BitmapFactory读取图片的宽高的信息受图片所在drawable文件夹和设备屏幕本身的像素密度影响。
2.3 压缩图片简单实践
直接百度了一张imac的5k分辨率5120 * 2880大小为5.97M的壁纸,直接加载我的手机百分百会出现oom
效果
java代码:
public class MainA