Android开发之大位图二次采样压缩处理(源代码分享)

图片有各种形状和大小。在许多情况下这些图片是远远大于我们的用户界面(UI)且占据着极大的内存空间,如果我们不对位图进行压缩处理,我们的程序会发生内存泄露的错误。

MainActivity的代码

package com.example.g08_bitmap;

import android.os.Bundle;
import android.app.Activity;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.widget.ImageView;

public class MainActivity extends Activity {
	private ImageView imageView;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		imageView = (ImageView) this.findViewById(R.id.imageView1);
		imageView.setImageBitmap(decodeSampledBitmapFromResource(
				getResources(), R.drawable.a, 300, 300));
	}

	public static Bitmap decodeSampledBitmapFromResource(Resources res,
			int resId, int reqWidth, int reqHeight) {
		final BitmapFactory.Options options = new BitmapFactory.Options();
		//先将inJustDecodeBounds属性设置为true,解码避免内存分配
		options.inJustDecodeBounds = true;
		// 将图片传入选择器中
		BitmapFactory.decodeResource(res, resId, options);
		// 对图片进行指定比例的压缩
		options.inSampleSize = calculateInSampleSize(options, reqWidth,
				reqHeight);
		//待图片处理完成后再进行内存的分配,避免内存泄露的发生
		options.inJustDecodeBounds = false;
		return BitmapFactory.decodeResource(res, resId, options);
	}

	// 计算图片的压缩比例
	public static int calculateInSampleSize(BitmapFactory.Options options,
			int reqWidth, int reqHeight) {
		// Raw height and width of image
		final int height = options.outHeight;
		final int width = options.outWidth;
		int inSampleSize = 1;

		if (height > reqHeight || width > reqWidth) {

			final int heightRatio = Math.round((float) height
					/ (float) reqHeight);
			final int widthRatio = Math.round((float) width / (float) reqWidth);
			// 选择长宽高较小的比例,成为压缩比例
			inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio;
		}
		return inSampleSize;
	}

}

Android开发之大位图二次采样压缩处理(源代码分享)

时间: 2024-10-16 11:15:44

Android开发之大位图二次采样压缩处理(源代码分享)的相关文章

Android BitmapFactory图片压缩处理(大位图二次采样压缩处理)

Android实际开发中,在加载大量图片的时候,比如ViewPager.GridView.ListView中,加载了大量的比较大图片就容易出现OOM(内存溢出)的异常,这是因为一个应用的最大内存使用只有16M,超过了这个值,就会出现OOM.所以我们实际开发中,要想避免OOM出现就要对相应的图片进行压缩处理. 本文即使用了BitmapFactory和BitmapFactory.Option这两个类,对图片进行相应的尺寸压缩处理.经测试,成功解决了未压缩图片之前出现的OOM异常. 实现效果图: 本D

Android开发之大位图压缩水印处理

我们在发微博或者csdn博文的时候都可以给图片加上一个水印,一个独立的标识,那是怎么实现的呢?先封装一个BitmapTools封装类,该类要解决的问题是一将突破存储至sdcard中,二给图片加上水印. BitmapTools package com.example.g11_bitmap04; import java.io.File; import java.io.FileOutputStream; import java.io.OutputStream; import android.conte

Android开发之使用BroadcastReceiver实时监听电量(源代码分享)

Android系统中实时的监听手机电量以及开机启动功能都是通过BroadcastReceiver组件实现的.我们可以动态注册这个类的一个实例通过Context.registerReceiver()方法或者静态注册,通过<Receiver>标记在androidmanifest . xml.注意:如果我们注册一个接收器在Activity.onResume()实现,我们应该注销Activity在Activity生命周期的onPause方法中.(这将减少不必要的系统开销).切记不能注销Activity

Android开发之自定义Dialog二次打开报错问题解决

之前自定义了一个AlertDialog对话框,第一次点击时正常,但第二次调用时会出现错误:java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first. 关于这个错误纠结了我好久,在网上百度了也不少,但感觉解决效果都达不到自己想要的效果.网上的解释说是一个子视图指定了多个父视图.由此可以推断出,在第二

【Android开发VR实战】二.播放360&amp;#176;全景视频

转载请注明出处:http://blog.csdn.net/linglongxin24/article/details/53924006 本文出自[DylanAndroid的博客] [Android开发VR实战]二.播放360°全景视频 VR即Virtual Reality虚拟现实.虚拟现实技术是一种能够创建和体验虚拟世界的计算机仿真系统它利用计算机生成一种模拟环境是一种多源信息融合的交互式的三维动态视景和实体行为的系统仿真使用户沉浸到该环境中. 那么,怎样在Android中去开发VR功能的APP

【Android开发VR实战】二.播放360&#176;全景视频

转载请注明出处:http://blog.csdn.net/linglongxin24/article/details/53924006 本文出自[DylanAndroid的博客] [Android开发VR实战]二.播放360°全景视频 VR即Virtual Reality虚拟现实.虚拟现实技术是一种可以创建和体验虚拟世界的计算机仿真系统它利用计算机生成一种模拟环境是一种多源信息融合的交互式的三维动态视景和实体行为的系统仿真使用户沉浸到该环境中. 那么,如何在Android中去开发VR功能的APP

Android 开发技巧总结(二)

1.首选项的存取数据 写一个类,里面放入存取方法,然后在外面进行调用 public class PrefsUtils { private static final String PREFS_NAME="com.yomoto.util.OtherPrefs"; //这里放入的名字存入的地址是:data/data/项目包名/shared_prefs/PREFS_NAME //得到首选项中的数据 public static String getValue(Context context,St

Android开发之自定义Spinner样式的效果实现(源代码实现)

android系统自带的Spinner样式是远远满足不了我们实际开发过程中对Spinner UI风格的要求,因此我们肯定需要为了切合整个应用的风格,修改我们的Spinner样式.系统给我们提供了两种常见的修改方式,一个是用XML方式静态,另一个就是Java代码动态来修改啦,我们这篇文章呢主要就是介绍如何动态修改Spinner的样式.我的实现方法呢,是自己构造一个SpinnerAdapter,继承来自ArrayAdapter,重写getDropDownView(),getView()这两个方法就好

Android开发之自己定义TabHost文字及背景(源码分享)

使用TabHost 能够在一个屏幕间进行不同版面的切换,而系统自带的tabhost界面较为朴素,我们应该怎样进行自己定义改动优化呢 MainActivity的源码 package com.dream.ledong; import android.app.TabActivity; import android.content.Intent; import android.graphics.Color; import android.os.Bundle; import android.view.Gr