加载图片到内存中

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值