android中的大图片一般都要经过压缩才显示,不然容易发生oom,一般我们压缩的时候都只关注其尺寸方面的大小,其实除了尺寸之外,影响一个图片占用空间的还有其色彩细节。
打开Android.graphics.Bitmap类里有一个内部类Bitmap.Config类,在Bitmap类里createBitmap(intwidth, int height, Bitmap.Config config)方法里会用到,打开个这个类一看
枚举变量
public static final Bitmap.Config ALPHA_8;
public static final Bitmap.Config ARGB_4444;
public static final Bitmap.Config ARGB_8888;
public static final Bitmap.Config RGB_565;
ALPHA_8, ARGB_4444,ARGB_8888,RGB_565 到底是什么呢?
其实这都是色彩的存储方法:我们知道ARGB指的是一种色彩模式,里面A代表Alpha,R表示red,G表示green,B表示blue,其实所有的可见色都是右红绿蓝组成的,所以红绿蓝又称为三原色,每个原色都存储着所表示颜色的信息值
ALPHA_8:Alpha由8位组成
ARGB_4444:由4个4位组成即16位,
ARGB_8888:由4个8位组成即32位,
RGB_565:R为5位,G为6位,B为5位共16位
由此可见:
ALPHA_8 代表8位Alpha位图
ARGB_4444 代表16位ARGB位图
ARGB_8888 代表32位ARGB位图
RGB_565 代表8位RGB位图
位图位数越高代表其可以存储的颜色信息越多,当然图像也就越逼真。
用法:
在压缩之前将option的值设置一下:
options.inPreferredConfig = Bitmap.Config.RGB_565;
加载大位图>>方法:像素缩放和图片质量缩放
获取屏幕宽高
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
DisplayMetrics displayMetric = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(displayMetric);// 获取屏幕宽高度
Bitmap bitmap = decodeBitmap(displayMetric.widthPixels,
displayMetric.heightPixels, 这里传入一个图片的byte数组);// 按照屏幕的宽高度进行压缩
}
压缩图片的方法
/** 压缩图片
*
* @param width
* 期望的宽度
* @param height
* 期望的高度
* @param bytes
* 原始图片的byte数组
* @return 压缩后的位图
*/
private Bitmap decodeBitmap(int width, int height, byte[] bytes) {
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;// 进入只编码模式,只获取元数据,不真正加载整个图片
BitmapFactory.decodeByteArray(bs, 0, bs.length, options);// 得到元数据
int outHeight = options.outHeight;// 获取到图片的高度
int outWidth = options.outWidth;// 获取到图片的宽度
/** 进行压缩,按照宽高度比例压缩 */
// int heightScale = (outHeight + height - 1) / height;
// int widthScale = (outWidth + width - 1) / width;
/** 自定义标准,0.4以内视为0 超过0.4视为1? */
int heightScale = (int) (outHeight * 1.0 / height + 0.6f);// 高度的缩放比例值
int widthScale = (int) (outWidth * 1.0 / width + 0.6f);// 宽度的缩放比例值
int realScale = heightScale > widthScale ? heightScale : widthScale;// 计算出真正的缩放比例
options.inPreferredConfig = Bitmap.Config.RGB_565;// 设置图片的质量
if (realScale > 1) {// 如果缩放比例大于1,就缩放
options.inSampleSize = realScale;// 设置缩放比例
}
// 重新生成图片
options.inJustDecodeBounds = false;// 退出仅编码格式
Bitmap decodeResource = BitmapFactory.decodeByteArray(bs, 0, bs.length,
options);// 重新生成图片
return decodeResource;// 返回缩放的图片
}
引用资料:图片质量参数