Android(java)学习笔记179:多媒体之加载大图片到内存(Bitmap API)

本文详细介绍了在Android中如何高效地加载大图片,避免内存溢出的问题。通过获取屏幕尺寸、设置图片解码比例并调整解码大小,实现大图片在不同设备上的灵活展示。

1. Bitmap (API使用

android里面的bitmap中,一个像素点需要4个byte去表示,这是因为android表示颜色是" argb ";其中 a 表示是透明度,然后是" rgb"

颜色表示范围 00000000 ~~~ffffffff

2. 加载图片到内存:

上面说到了图形表示使用4byte,和int一样,所以Android里面每个像素点都是使用一个int来表示的。

Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.girl);
iv = (ImageView) findViewById(R.id.iv);
iv.setImageBitmap(bitmap);

 

 

2. 加载大图片到内存:

Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.very_large_phone);
iv = (ImageView) findViewById(R.id.iv);
iv.setImageBitmap(bitmap);

这里的图片very_large_phone非常大,1.69M(2560*1504);

那么这个图片在Android中需要2560*1504*4 = 15400960 byte才能表示这张图片,结果或出现OOM(OUT OF MEMONY)内存溢出的错误。

说明Android显示图片不是看图片自身的大小,而是看分辨率

 

 

那么Android该怎么显示大图片(大分辨率)

 

//为了避免oom异常,根据屏幕的尺寸对图片进行缩放

//1.先获取手机屏幕的宽和高

WindowManager  wm = (WindowManager)getSystemService( WINDOW_SERVICE );

int  screenWidth  =  wm.getDefaultDisplay().getWidth();

int  screenHeight = wm.getDefaultDisplay().getHeight();

 

//2.获取图片的宽和高

BitmapFactory.Options  opts = new Option();//创建一个配置参数

opts.inJustDecodeBounds = true;//表示不真实地解析这个位图,只是解析位图的宽高信息(不申请空间解析这个图片,自然没有内存溢出

 

Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.very_large_phone,opts);

int  width = opts.outWidth ;

int  height = opts.outHeight ;

 

//3.计算缩放的比例

int scale = 1;

int scaleX = width  / screenWidth;

int scaleY = height / screenHeight;

if(scaleX > scaleY && scaleY >1 ) {

     scale = scaleX ;

}

if(scaleY> scaleX && scaleX  >1 ) {

               scale = scaleY ;

}

 

//4.根据缩放比例,真实解析位图

opts.inSampleSize = scale;

opts.inJustDecodeBounds = false;//真实地解析这个位图,返回bitmap;

 bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.very_large_phone,opts);//缩放后的bitmap

iv.setImageBitmap(bitmap);

 

转载于:https://www.cnblogs.com/hebao0514/p/4803449.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值