在实际中,有些时候我们需要从SD卡中加载一张很大的图片到内存中,但是如果你手机存储很小的话,如果直接将这张大图片放入内容就会导致分配失败等异常问题。所以我们就需要一种手段,将大图片也能正常的加载到内存,而不出现异常的情况。

那如何才能将大图片加载到内存中,而不出现内存溢出?

Android系统提供了一个方法,通过显示比例加载图片,这样就会返回比原图更小的图片。

1: 先要获取该图片的参数情况,Android系统提供了一个BitmapFactory这个类

可以创建一个Bitmap对象,从不同的源可以获取图片资源。

BitmapFactory.decodeResource(res, id)

用如上的代码就能获得一个Bitmap对象。BitmapFactory.decodeResource方法的第二个参数就能获取到图片的各项参数

BitmapFactory.decodeResource(getResources(), R.drawable.dog, opts);

2: Options是一个类, 里面封装了图片的各项参数

/*inJustDecodeBounds等于true: 代表的是将返回的是null,不是bitmap的对象,但是却能得到源文件的参数情况*/opts.inJustDecodeBounds = true;

3:获取屏幕的宽和高

//获取屏幕的宽和高Display dp = getWindowManager().getDefaultDisplay();int screenWidth = dp.getWidth(); int screenHeight = dp.getHeight();

4:计算缩放比例:

/*计算图片的缩放比例*/int scale = 1;int scaleWidth = imageWidth / screenWidth;int scaleheight = imageHeight / screenHeight;if(scaleWidth >= scaleheight && scaleWidth >= 1){scale = scaleWidth;}else if (scaleheight > scaleWidth && scaleheight >= 1) {scale = scaleheight;}

5: 再获取Bitmap对象,以比例的方式去获取

/*设置图片的缩放比例*/opts.inSampleSize = scale;/*如果大于1, 请求解码器去对原图取样,返回一个更小的image*/opts.inJustDecodeBounds = false;Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.dog, opts);/*显示图片*/ImageView iView = (ImageView) findViewById(R.id.iv);iView.setImageBitmap(bitmap);

整个代码:

public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Button button = (Button) findViewById(R.id.button);button.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View arg0) {// TODO Auto-generated method stubLog.i("MainActivity", "onclick");/*先解析这张很大图片,得到图片参数情况*/Options opts = new Options();/*inJustDecodeBounds等于true: 代表的是将返回的是null,不是bitmap的对象,但是却能得到源文件的参数情况*/opts.inJustDecodeBounds = true;//BitMapFactory这个类是创建一个bitmap对象,是通过不同的源BitmapFactory.decodeResource(getResources(), R.drawable.dog, opts);//获取到图片的宽和高int imageWidth = opts.outWidth;int imageHeight = opts.outHeight;//获取屏幕的宽和高Display dp = getWindowManager().getDefaultDisplay();int screenWidth = dp.getWidth(); int screenHeight = dp.getHeight();/*计算图片的缩放比例*/int scale = 1;int scaleWidth = imageWidth / screenWidth;int scaleheight = imageHeight / screenHeight;if(scaleWidth >= scaleheight && scaleWidth >= 1){scale = scaleWidth;}else if (scaleheight > scaleWidth && scaleheight >= 1) {scale = scaleheight;}/*设置图片的缩放比例*/opts.inSampleSize = scale;/*如果大于1, 请求解码器去对原图取样,返回一个更小的image*/opts.inJustDecodeBounds = false;Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.dog, opts);/*显示图片*/ImageView iView = (ImageView) findViewById(R.id.iv);iView.setImageBitmap(bitmap);}});}}

效果图:

Android 多媒体开发学习之加载大图片相关推荐

  1. Android加载大图片不OutOfMemoryError

    Android加载图片时,对于分辨率小,配置低的机子,很容易发生OutOfMemoryError.手机的内存比图片的大很多,怎么会这样? 在设置Android虚拟机的内存时: RAM:模拟器的内存空间 ...

  2. Android加载大图片OOM异常解决

    Android加载大图片OOM异常解决 参考文章: (1)Android加载大图片OOM异常解决 (2)https://www.cnblogs.com/jevan/archive/2012/07/05 ...

  3. Android手机内存图片读取,有效解决Android加载大图片内存溢出的问题

    今天在交流群里,有人问我他经常遇到加载图片时内存溢出的问题,遇到的情况还是在自己的测试机或者手机里没有问题,做好了, 到了客户手机里就内存溢出了.其实有时候不同的手机和不同的系统对内存的要求不一样,尤 ...

  4. 【转载】Android加载大图片OOM异常解决

    官方资料: https://developer.android.com/topic/performance/graphics/load-bitmap 思路 先测试未知来源图片的尺寸和MIME文件类型; ...

  5. Android中如何加载大图片和长图片

    我们在做开发的时候总是会不可避免的遇到加载图片的情况,当图片的尺寸小于ImageView的尺寸的时候,我们当然可以很happy的去直接加载展示.但是如果我们要加载的图片远远大于ImageView的大小 ...

  6. Android 加载大图片

    我们在做开发的时候总是会不可避免的遇到加载图片的情况,当图片的尺寸小于ImageView的尺寸的时候,我们当然可以很happy的去直接加载展示.但是如果我们要加载的图片远远大于ImageView的大小 ...

  7. Android 高效加载大图片

    来源:http://www.open-open.com/lib/view/open1389755918242.html 我们在编写Android程序的时候经常要用到许多图片,不同图片总是会有不同的形状 ...

  8. 解决Android 加载大图片OOM

    图片在Android 占用内存计算 假如一张图的像素为100×200,那么他在内存中占用的内存为: 100×200(像素点) × 4(每个像素点占用的内存,默认为4.) public Bitmap.C ...

  9. android 广告效果图,Android_Android实现加载广告图片和倒计时的开屏布局,这是一个android开屏布局的实例 - phpStudy...

    Android实现加载广告图片和倒计时的开屏布局 这是一个android开屏布局的实例,可以用于加载广告图片和倒计时的布局.程序中设置的LayoutParams,划分额外空间比例为6分之5,具体权重比 ...

  10. 前端加载大图片从模糊到清晰

    打开天猫随便点了个链接,加载了一张大的背景图片,该图片从非常模糊到正常显示有一个过程,深入了解一下它的实现过程. 打开控制台,禁用Cache,模拟2G网络,刷新页面 查看请求列表,浏览器先请求了一张缩 ...

最新文章

  1. 区块链学堂:区块链引子
  2. php 的包管理工具 composer
  3. Linux开发常见问题:GCC:链接器输入文件未使用,因为链接尚未完成
  4. byte[]、sbyte[]、int[]以及Array的故事
  5. sql中 in 、not in 、exists、not exists 用法和差别
  6. python玩王者荣耀皮肤碎片怎么获得_大神教你用Python爬取王者荣耀英雄皮肤,不充钱也能入手!...
  7. python小说全站爬虫_起点小说网全站爬虫(Python)
  8. php 可变变量 $$name
  9. 每个程序员都应读的30本书
  10. detached entity passed to persist:xxx;
  11. VMware的磁盘格式化
  12. 读书笔记-Rse2Net
  13. sql server XML中value(),exists(),nodes()方法
  14. 关于文献阅读和寻找新的科研题目
  15. 金融量化-对数收益率
  16. 5分钟搞定OKR工作法
  17. matlab中怎么进行曲线拟合/平滑图像/多项式拟合?
  18. 数学分析教程史济怀练习15.5
  19. 两个网口芯片接一个变压器_网口变压器的工作原理
  20. 用Python查找关键字

热门文章

  1. 阿里云负载均衡SSL证书配置(更新)
  2. Could not create ServerSocket on address 0.0.0.0/0.0.0.0:9083
  3. mysql批量插入优化
  4. [转]android:clipToPadding和android:clipChildren
  5. [51单片机] 四相五线减速比为1/64步进电机驱动设计
  6. 关于字节对齐(关于align)
  7. spark使用KryoRegistrator java代码示例
  8. 【译】WebSocket协议第五章——数据帧(Data Framing)
  9. 视频点播-上传视频状态异常
  10. Linux 进程间通信的六种机制