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. Sublime Text 常用的16 个 Sublime Text 快捷键

    在我做了一次包含一些现场编码的演示后,一些观众问我是如何操作这么快.当然这里没有唯一的答案,答案是一堆简单的快捷键和大量的实践的组合.为了回应那些询问,我觉得有必要看看我每天想都不用想且使用的快捷键. ...

  2. maven+springmvc+spring+mybatis+mysql详细搭建整合过程讲解

    转自:https://www.cnblogs.com/lmei/p/7190755.html?utm_source=itdadao&utm_medium=referral @_@ 写在最前 之 ...

  3. centos7安装redis3.2.12

    1.准备安装包,放在/usr/local/src/ 2.解压安装包,解压到/usr/local/ tar zxf redis-3.2.12.tar.gz -C /usr/local/ 3.cd /us ...

  4. ARM汇编中ldr伪指令和ldr指令(转载)

    转自:http://blog.csdn.net/ce123_zhouwei/article/details/7182756 ARM是RISC结构,数据从内存到CPU之间的移动只能通过L/S指令来完成, ...

  5. SCUT - 243 - 宝华复习 - 二分 - 桶计数

    https://scut.online/p/243 这道题唯一难点在于如何快速确定m合法.可以统计滑动窗口中已有元素的数量. #include<bits/stdc++.h> using n ...

  6. hdoj3711【水】

    题意: 给你两个集合,对于每个B集合的元素,从A集合找一个数使得a^b的二进制的1个数最少. 思路: 直接搞= = #include <bits/stdc++.h> using names ...

  7. bzoj 1023: [SHOI2008]cactus仙人掌图【tarjan+dp+单调队列】

    本来想先求出点双再一个一个处理结果写了很长发现太麻烦 设f[u]为u点向下的最长链 就是再tarjan的过程中,先照常处理,用最长儿子链和次长儿子链更新按ans,然后处理以这个点为根的环,也就是这个点 ...

  8. HttpClient替换HttpWebRequest--以GET和POST请求为例说明

    首先说一下HttpRequest.WebClient和HttpClient的关系:HttpRequest是基层的请求方式,WebClient是对HttpRequest的简化封装,在WebClient中 ...

  9. SpringBoot自定义参数解析器

    一.背景 平常经常用 @RequestParam注解来获取参数,然后想到我能不能写个自己注解获取请求的ip地址呢?就像这样 @IP String ip 二.分析 于是开始分析 @RequestPara ...

  10. iOS 优雅地隐藏导航栏NavigationBar (Objc)

    @interface FSViewController () <UINavigationControllerDelegate> @end @implementation FSViewCon ...