1. Bitmap (API使用)

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

颜色表示范围 ~~~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);

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

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

    1.Bitmap (API使用) android里面的bitmap中,一个像素点需要4个byte去表示,这是因为android表示颜色是" argb ":其中 a 表示是透明度,然 ...

  2. Flutter学习笔记(19)--加载本地图片

    如需转载,请注明出处:Flutter学习笔记(19)--加载本地图片 上一篇博客正好用到了本地的图片,记录一下用法: 首先新建一个文件夹,这个文件夹要跟目录下 然后在pubspec.yaml里面声明出 ...

  3. Android开发中如何解决加载大图片时内存溢出的问题

    Android开发中如何解决加载大图片时内存溢出的问题    在Android开发过程中,我们经常会遇到加载的图片过大导致内存溢出的问题,其实类似这样的问题已经屡见不鲜了,下面将一些好的解决方案分享给 ...

  4. Android -- 加载大图片到内存,从gallery获取图片,获取图片exif信息

    1. 加载大图片到内存,从gallery获取图片 android默认的最大堆栈只有16M, 图片像素太高会导致内存不足的异常, 需要将图片等比例缩小到适合手机屏幕分辨率, 再加载. 从gallery ...

  5. 图片_ _Android有效解决加载大图片时内存溢出的问题 2

    Android有效解决加载大图片时内存溢出的问题 博客分类: Android Android游戏虚拟机算法JNI 尽量不要使用setImageBitmap或 setImageResource或 Bit ...

  6. Android学习笔记_51_转android 加载大图片防止内存溢出

    首先来还原一下堆内存溢出的错误.首先在SD卡上放一张照片,分辨率为(3776 X 2520),大小为3.88MB,是我自己用相机拍的一张照片.应用的布局很简单,一个Button一个ImageView, ...

  7. Android 加载大图片到内存

    本文演示android中图片加载到内存 首先设计界面: 代码如下: <LinearLayout xmlns:android="http://schemas.android.com/ap ...

  8. Android有效解决加载大图片时内存溢出的问题

    首先,您需要了解一下,图片占用内存的计算方法,传送门:http://blog.csdn.net/scry5566/article/details/11568751 尽量不要使用setImageBitm ...

  9. android加载大图片到内存

    1)演示效果: 1)代码演示: 布局代码: 权限配置:

随机推荐

  1. POJ1228:Grandpa's Estate(给定一些点,问是否可以确定一个凸包)

    Being the only living descendant of his grandfather, Kamran the Believer inherited all of the grandp ...

  2. [Selenium] Selenium common Actions Examples

    1.sendKeys() 在文本框中输入字符串 WebElement searchBox = driver.findElement(By.name("q")); searchBox ...

  3. flask的config配置和给实例化传入参数

    灵活性主要体现在配置上,需要什么就配置什么 from flask import Flask app = Flask(__name__) # type:Flask # 调试模式:是否开启调试模式并捕获异 ...

  4. HNOI2017 day1 T3 礼物

    题目大意: 我的室友最近喜欢上了一个可爱的小女生.马上就要到她的生日了,他决定买一对情侣手环,一个留给自己,一个送给她.每个手环上各有 n 个装饰物,并且每个装饰物都有一定的亮度.但是在她生日的前一天 ...

  5. 最优灌溉_最小生成树Kruskal

    问题描述 雷雷承包了很多片麦田,为了灌溉这些麦田,雷雷在第一个麦田挖了一口很深的水井,所有的麦田都从这口井来引水灌溉. 为了灌溉,雷雷需要建立一些水渠,以连接水井和麦田,雷雷也可以利用部分麦田作为“中 ...

  6. zabbix 监控mysql状态 -Windows

    由于公司爬虫mysql数据库在Windows下面,监控一下: 主要命令:mysqladmin -uroot -proot -h127.0.0.1 ping 2>D:\zabbix\waring. ...

  7. centos7无故重启-内核升级

    最近有一台物理服务器,centos7操作系统,无故重启,每天都会发生这种情况: 解决: 升级内核 CentOS 允许使用 ELRepo,这是一个第三方仓库,可以将内核升级到最新版本,使用ELRepo升 ...

  8. 洛谷 - P2335 - 位图 - 简单dp

    https://www.luogu.org/problemnew/show/P2335 假如我们使用dp的话,每次求出一个点的左上方.右上方.左下方.右下方的最近的白点的距离.那么只是n²的复杂度.这 ...

  9. Codeforces404C【构造】

    题意: 一个图有n个点,每一个点最多连接k条直线,给出多有起点到终点的距离,没有环,不能输出重边,输出所有有连接的单向边 思路: 就是简单想-不知道怎么说了,画个图,我们建边,那么距离是 i 就是连距 ...

  10. IEnumerable<T> 的时候一个主意事项p

    IEnumerator IEnumerable.GetEnumerator() { return _vtDataView.GetEnumerator(); } public IEnumerator&l ...