[置顶] android加载大图片到内存

在andorid编程中,我们有时需要讲一张像素很高的图片加载的图片中,如果我们是这样去做

	public void load1(View view) {
		String src = "mnt/sdcard/DSC.jpg";
		Bitmap bitmap = BitmapFactory.decodeFile(src);
		this.iv_img.setImageBitmap(bitmap);
	}

可能就是抛出 java.lang.OutOfMemoryError异常

这是由于在android系统中,默认情况下,dailvike虚拟机只会为每个应用程序分配16M的内存空间

而加载高像素的图片是非常消耗内存的,如果这时我们不将图片进行缩放就直接加载到内存,很容易就会抛出内存泄漏的异常

因此,我们可以这么来操作

public class MainActivity extends Activity {
	private ImageView iv_img;
	private int windowHeight;
	private int windowWidth;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		this.iv_img = (ImageView) this.findViewById(R.id.iv_img);
		WindowManager manager = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
		// 第一种获取手机屏幕宽高的方法
		this.windowHeight = manager.getDefaultDisplay().getHeight();
		this.windowWidth = manager.getDefaultDisplay().getWidth();
		System.out.println("手机宽 :" + this.windowWidth);
		System.out.println("手机高 :" + this.windowHeight);

		// 第二种获取手机屏幕宽高的方法,但是getSize()是从 API Level 13才有的方法
		// Point outSize = new Point();
		// manager.getDefaultDisplay().getSize(outSize );
		// this.windowWidth = outSize.x;
		// this.windowHeight = outSize.y;
	}

	public void load1(View view) {
		String src = "mnt/sdcard/DSC.jpg";
		Bitmap bitmap = BitmapFactory.decodeFile(src);
		this.iv_img.setImageBitmap(bitmap);
	}

	public void load2(View view) {
		String src = "mnt/sdcard/DSC.jpg";

		// 图片解析的配置
		Options options = new Options();
		// 不去真正解析图片,只是获取图片的宽高
		options.inJustDecodeBounds = true;
		BitmapFactory.decodeFile(src, options);
		int imageWidth = options.outWidth;
		int imageHeight = options.outHeight;
		System.out.println("图片宽 :" + imageWidth);
		System.out.println("图片高 :" + imageHeight);

		int scaleX = imageWidth / this.windowWidth;
		int scaleY = imageHeight / this.windowHeight;
		int scale = 1;
		if (scaleX >= scaleY && scaleX >= 1) {
			// 水平方向的缩放比例比竖直方向的缩放比例大,同时图片的宽要比手机屏幕要大,就按水平方向比例缩放
			System.out.println("按宽比例缩放");
			scale = scaleX;
		} else if (scaleY >= scaleX && scaleY >= 1) {
			// 竖直方向的缩放比例比水平方向的缩放比例大,同时图片的高要比手机屏幕要大,就按竖直方向比例缩放
			System.out.println("按高比例缩放");
			scale = scaleY;
		}
		System.out.println("缩放比例:" + scale);
		// 真正解析图片
		options.inJustDecodeBounds = false;
		// 设置采样率
		options.inSampleSize = scale;
		Bitmap bitmap = BitmapFactory.decodeFile(src,options);
		this.iv_img.setImageBitmap(bitmap);

	}
}


简单的布局文件

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <Button
        android:onClick="load1"
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:text="不缩放加载图片" />

    <ImageView
        android:id="@+id/iv_img"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_alignLeft="@+id/button1"
        android:layout_below="@+id/button1"
        android:src="@drawable/ic_launcher" />

    <Button
        android:onClick="load2"
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@+id/button1"
        android:layout_toRightOf="@+id/button1"
        android:text="缩放加载图片" />

</RelativeLayout>


进过缩放之后的图片再加载到内存,就不会再抛出异常。

你可能感兴趣的:(android,图片,内存,内存泄漏)