博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
加载图片到内存中
阅读量:2397 次
发布时间:2019-05-10

本文共 2067 字,大约阅读时间需要 6 分钟。

图片过大会直接导致内存溢出,所以一般加载之前要先处理一下。

1.通过窗体管理器WindowManager得到屏幕的宽高信息

2.通过图片头文件信息Options得到图片的宽高。

3.计算缩放比例

4.缩放加载真实图片Bitmap到内存

package com.itheima.loadimg;import android.app.Activity;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.BitmapFactory.Options;import android.os.Bundle;import android.view.View;import android.view.WindowManager;import android.widget.ImageView;public class MainActivity extends Activity {	private ImageView iv;	@Override	protected void onCreate(Bundle savedInstanceState) {		super.onCreate(savedInstanceState);		setContentView(R.layout.activity_main);		iv = (ImageView) findViewById(R.id.iv);	}	public void click(View view){		//相当消耗内存资源 根据图片的分辨率而定		//不能直接加载图片,要对图片进行缩放		//手机屏幕本来就小,不需要大像素的的图片,所以可以直接缩放		// Bitmap bitmap = BitmapFactory.decodeFile("/mnt/sdcard/photo.jpg");		// iv.setImageBitmap(bitmap);				//1.通过窗体管理器得到屏幕的宽高信息		WindowManager wm = getWindowManager();		//虽然这个方法过时了,但是还是用这个,新的方法在新版本才有,不能兼容2.3		int screenWidth = wm.getDefaultDisplay().getWidth();		int screenHeight = wm.getDefaultDisplay().getHeight();		System.out.println("屏幕宽高:"+screenWidth+"-"+screenHeight);		//2.得到图片的宽高。		//这里不像上面那样加载图片,防止奔溃		//只加载头文件信息(就是鼠标移动到图片显示出来的信息),api和上面的是不一样的		BitmapFactory.Options opts = new Options();//解析位图的附加条件		opts.inJustDecodeBounds = true;//不去解析真实的位图,只是获取这个位图的头文件信息		Bitmap bitmap = BitmapFactory.decodeFile("/mnt/sdcard/photo.jpg", opts);		int bitmapWidth = opts.outWidth;		int bitmapHeight = opts.outHeight;		System.out.println("图片宽高: "+bitmapWidth+"-"+bitmapHeight);				//3.计算缩放比例		int dx = bitmapWidth/screenWidth;		int dy = bitmapHeight/screenHeight;		int scale = 1;		//dy>1 是在指明图片像素比手机屏幕还小的情况下就不能缩比例了		if(dx>dy&&dy>1){			System.out.println("按照水平方法缩放,缩放比例:"+dx);			 scale = dx;		}				if(dy>dx&&dx>1){			System.out.println("按照垂直方法缩放,缩放比例:"+dy);			scale = dy;		}		//4.缩放加载图片到内存。		opts.inSampleSize = scale;		opts.inJustDecodeBounds = false;//真正的去解析这个位图。		bitmap = BitmapFactory.decodeFile("/mnt/sdcard/photo.jpg", opts);		iv.setImageBitmap(bitmap);	}}

转载于:https://my.oschina.net/u/2356176/blog/420806

你可能感兴趣的文章
五步轻松搞定Linux下的文件同步(备份)
查看>>
从Socket编程看HTTP服务器设计
查看>>
Java SPI机制原理和使用场景
查看>>
Spring IOC循环依赖解决方案分析
查看>>
Mysql explain-type使用详解
查看>>
Mysql explain-Extra(using where,using index)使用详解
查看>>
解决亚马逊调用频率限制问题的sdk框架
查看>>
Ocean设计思路和架构设计
查看>>
RPC框架(一) - Java自带的RMI
查看>>
RPC框架(二) - Dubbo
查看>>
缓存篇(一)- Guava
查看>>
缓存篇(二)- JetCache
查看>>
缓存篇(三)- Spring Cache框架
查看>>
MySQL基本原理和使用技巧
查看>>
排序算法总结(含动图演示和Java代码实现)
查看>>
别踩坑!使用MySQL唯一索引请注意
查看>>
Guava Cache expireAfterWrite 与 refreshAfterWrite区别
查看>>
Java8新特性学习(一)- 开篇介绍
查看>>
Java8新特性学习(二)- Optional类
查看>>
Java8新特性学习(三)- Stream类
查看>>