Android(java)学习笔记236:多媒体之加载大图片到内存(Bitmap API)
2015-09-12 19:16
821 查看
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.加载大图片到内存:
[b]Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.very_large_phone);
iv = (ImageView) findViewById(R.id.iv);
iv.setImageBitmap(bitmap);[/b]
[b]这里的图片very_large_phone非常大,1.69M(2560*1504);[/b]
[b]那么这个图片在Android中需要2560*1504*4 = 15400960 byte才能表示这张图片,结果或出现OOM(OUT OF MEMONY)内存溢出的错误。[/b]
[b]说明Android显示图片不是看图片自身的大小,而是看分辨率。[/b]
[b]那么Android该怎么显示大图片(大分辨率)?[/b]
[b]//为了避免oom异常,根据屏幕的尺寸对图片进行缩放[/b]
[b]//1.先获取手机屏幕的宽和高[/b]
[b]WindowManager wm = [/b][b](WindowManager)getSystemService( WINDOW_SERVICE );[/b]
[b]int screenWidth = wm.getDefaultDisplay().getWidth();[/b]
[b][b][b]int screenHeight = wm.getDefaultDisplay().getHeight();[/b][/b][/b]
[b][b][b]//2.获取图片的宽和高[/b][/b][/b]
[b][b][b]BitmapFactory.Options opts = new Option();//创建一个配置参数[/b][/b][/b]
[b][b][b]opts.inJustDecodeBounds = true;//表示不真实地解析这个位图,只是解析位图的宽高信息(不申请空间解析这个图片,自然没有内存溢出)[/b][/b][/b]
[b]Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.very_large_phone,opts);[/b]
[b]int width = opts.outWidth ;[/b]
[b]int height = opts.outHeight ;[/b]
[b]//3.计算缩放的比例[/b]
[b]int scale = 1;[/b]
[b]int scaleX = width / screenWidth;[/b]
[b]int scaleY = height / screenHeight;[/b]
[b]if(scaleX > scaleY && scaleY >1 ) {[/b]
[b] [b][b]scale = scaleX ;[/b][/b][/b]
[b]}[/b]
if([b]scaleY> [b]scaleX[/b] && [b][b]scaleX[/b] [/b] >1 ) {[/b]
scale = scaleY ;
}
//4.根据缩放比例,真实解析位图
opts.inSampleSize = scale;
opts.inJustDecodeBounds = false;//真实地解析这个位图,返回bitmap;
[b] bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.very_large_phone,opts);//缩放后的bitmap[/b]
[b]iv.setImageBitmap(bitmap);[/b]
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.加载大图片到内存:
[b]Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.very_large_phone);
iv = (ImageView) findViewById(R.id.iv);
iv.setImageBitmap(bitmap);[/b]
[b]这里的图片very_large_phone非常大,1.69M(2560*1504);[/b]
[b]那么这个图片在Android中需要2560*1504*4 = 15400960 byte才能表示这张图片,结果或出现OOM(OUT OF MEMONY)内存溢出的错误。[/b]
[b]说明Android显示图片不是看图片自身的大小,而是看分辨率。[/b]
[b]那么Android该怎么显示大图片(大分辨率)?[/b]
[b]//为了避免oom异常,根据屏幕的尺寸对图片进行缩放[/b]
[b]//1.先获取手机屏幕的宽和高[/b]
[b]WindowManager wm = [/b][b](WindowManager)getSystemService( WINDOW_SERVICE );[/b]
[b]int screenWidth = wm.getDefaultDisplay().getWidth();[/b]
[b][b][b]int screenHeight = wm.getDefaultDisplay().getHeight();[/b][/b][/b]
[b][b][b]//2.获取图片的宽和高[/b][/b][/b]
[b][b][b]BitmapFactory.Options opts = new Option();//创建一个配置参数[/b][/b][/b]
[b][b][b]opts.inJustDecodeBounds = true;//表示不真实地解析这个位图,只是解析位图的宽高信息(不申请空间解析这个图片,自然没有内存溢出)[/b][/b][/b]
[b]Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.very_large_phone,opts);[/b]
[b]int width = opts.outWidth ;[/b]
[b]int height = opts.outHeight ;[/b]
[b]//3.计算缩放的比例[/b]
[b]int scale = 1;[/b]
[b]int scaleX = width / screenWidth;[/b]
[b]int scaleY = height / screenHeight;[/b]
[b]if(scaleX > scaleY && scaleY >1 ) {[/b]
[b] [b][b]scale = scaleX ;[/b][/b][/b]
[b]}[/b]
if([b]scaleY> [b]scaleX[/b] && [b][b]scaleX[/b] [/b] >1 ) {[/b]
scale = scaleY ;
}
//4.根据缩放比例,真实解析位图
opts.inSampleSize = scale;
opts.inJustDecodeBounds = false;//真实地解析这个位图,返回bitmap;
[b] bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.very_large_phone,opts);//缩放后的bitmap[/b]
[b]iv.setImageBitmap(bitmap);[/b]
相关文章推荐
- Android开发-进程
- android 4.4状态栏沉浸
- 自己动手做Android音乐播放器(续)
- Android Fragment 你应该知道的一切
- Android Binder机制浅析
- Android Fragment 真正的完全解析(下)
- Android-客户端上传多张图片到服务器功能实现
- Android Fragment 真正的完全解析(上)
- Android-采用Matrix对Bitmap加工
- Android图形编程基本概念
- 快速了解Android项目
- Android 获取手机内存存储容量信息
- android使用ViewHolder对ListView进行优化
- 通过Fragment + Viewpager+Gridview实现Android Tab切换菜单
- Android中SQLite应用详解
- ios 类似android的toast
- Android 数据存数---SQLite数据库
- Android实战简易教程-第五十七枪(分享小米手电筒源码)
- 2016最新Android安卓短信拦截(过Android4.4和Android5.0和Android5.1)源码
- Android中Popupwindow和Dialog的区别