安卓加载一张图片的大小并不是你到资源文件图片大小,比如下图我保存在资源文件图片17.93kb,但是代码直接加载图片,图片占空间为300ky明显比资源图片大很多
//加载图片代码
private ImageView iv, iv2;
private Bitmap bitmap, bitmap2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
iv = (ImageView) findViewById(R.id.iv);
iv2 = (ImageView) findViewById(R.id.iv2);
//没有处理的图片
bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.ti);
i(bitmap);
iv.setImageBitmap(bitmap);
}
//打印
void i(Bitmap bitmap) {
Log.e("jett", "---------图片" + bitmap.getWidth() + "X" + bitmap.getHeight() + " 内存大小:" + bitmap.getByteCount());
}
//我个人理解是安卓系统对存放不同资源文件夹的图片回根据需要显示的大小对图片做处理,图片实际占内存大小由图片的宽*高*一个像素点占的字节内存(一个像内存又跟图片编码格式有关,比如RGB_565比ARGB_888占内存小很多)
通过修改需要加载的bitmap大小和透明度属性就可以实现图片内存优化
//下面封装了工具类
**
* Created by Administrator on 2019/5/9.
* 图片尺寸缩放 透明度 修改优化工具
*/
public class MyImageSize {
public static Bitmap setBitmapSize(WeakReference<Context> reference, int id, int w, int h, boolean isAlpha) {
Resources resources = reference.get().getResources();
BitmapFactory.Options opts = new BitmapFactory.Options();//获取自定义参数对象
opts.inJustDecodeBounds = true;//设置只是解密(减少占用图片内存)只是修改图片属性
//修复图片参数(给的是图片地址,修改图片参数先要调用可以修改参数的方法decodeResource()第三参数就是修改参数的对象)
//执行 BitmapFactory.decodeResource()方法 设置的opts属性才生效
BitmapFactory.decodeResource(resources, id, opts);
/**
* 修改参数
*/
//先获取加载图片的宽高
int outWidth = opts.outWidth;
int outHeight = opts.outHeight;
//设置缩放图片的系数(int类型)
opts.inSampleSize = getSampleSize(outWidth, outHeight, w, h);
//设置是否需要透明度//安卓默认透明度未
if (!isAlpha) {
opts.inPreferredConfig = Bitmap.Config.RGB_565;
}
//注意前面设置只获取图片信息,这里要设置回获取图片
opts.inJustDecodeBounds=false;
return BitmapFactory.decodeResource(resources, id, opts);
}
//计算图片实际宽高 是 传入宽高值的 最小整数倍数
private static int getSampleSize(int outWidth, int outHeight, int w, int h) {
int sizer = 1;
if (outWidth > w && outHeight > h) {
sizer = 2;
while (outWidth / sizer > w && outHeight / sizer > h) {
sizer *= 2;
}
}
sizer /= 2;
return sizer;
}
}
//优化后执行代码图(图片占用内存由300kb变为3kb减少100倍,图片显示效果肉眼看没区别)