高效的使用Bitmap

在Android经常使用到Bitmap用于显示图片,如果图片过大,容易出现"OutOfMemory"异常,所以要对图片进行压缩显示。

通常使用BitmapFactory类的几个方法(decodeByteArray(), decodeFile(), decodeResource()等)来建立一个bitmap,在生成bitmap前,可以通过BitmapFactory.Options来设置属性,来保证不会出现OutOfMemory异常。首先可以通过需要显示图片的长宽来获取缩小的倍数:

private 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) {
            if (width > height) {
                 inSampleSize = Math.round((float) height / (float) reqHeight);
            } else {
                 inSampleSize = Math.round((float) width / (float) reqWidth);
            }
        }
        return inSampleSize;
	}

PS:官方文档说到,图片压缩时,使用2的倍数压缩效率会高,就是2,4,8…这种,我这里使用的是更接近需要的压缩倍数,官方文档看这里

使用两种方式来压缩图片,一种是根据需要的图片长宽,一种是根据需要的图片大小(就是多少K)。

先看第一种:

public Bitmap GetThumbImageByWH(boolean isRound,String imgPath, int imagewidth, int imageheight) {
		try {
			File picture = new File(imgPath);
			BitmapFactory.Options bitmapFactoryOptions = new BitmapFactory.Options();
			// set height and width of image
			bitmapFactoryOptions.inJustDecodeBounds = true;
			Bitmap bmap = BitmapFactory.decodeFile(picture.getAbsolutePath(),
					bitmapFactoryOptions);
			int inSampleSize = calculateInSampleSize(bitmapFactoryOptions,imagewidth,imageheight);

			bitmapFactoryOptions.inSampleSize = inSampleSize;
			bitmapFactoryOptions.inJustDecodeBounds = false;
			bmap = BitmapFactory.decodeFile(picture.getAbsolutePath(),
					bitmapFactoryOptions);

			return bmap;
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

PS:如果使用一个BitmapFactory.Options对象,要先把该对象的inJustDecodeBounds属性设置为true,inSampleSize设置完成后再设置为false。后面的是用来翻转图片的。

第二种方式:

public Bitmap getThumbImageBySize(String imgpath, int size, boolean adjustOrientation) {
		File file=new File(imgpath);
		FileInputStream fis = null;
		int filesize=0;
		try{
			fis = new FileInputStream(file);
			filesize = fis.available();
			Log.v("file length", ""+filesize);
			fis.close();
		}catch(Exception ex){
			Log.v("Read file error", ""+ex.getMessage());
		}
		if(filesize/1024<size){
			return BitmapFactory.decodeFile(imgpath);
		}
		// Revision:
		BitmapFactory.Options options = new BitmapFactory.Options();
		// Set it false to not build the bitmap,just record its width and height
		options.inJustDecodeBounds = true;
		// Get the Options object by the path
		BitmapFactory.decodeFile(imgpath, options);
		int height = options.outHeight;
		int width = options.outWidth;

		Bitmap smallBitmap = null;
		double multiple = (float)(width*height*4)/(float)(size*1024);

		int inSampleSize = (int)Math.ceil(Math.sqrt(((float)filesize/1024.0)/(float)size));
		options.inSampleSize=inSampleSize;
		options.inJustDecodeBounds = false;
		smallBitmap = BitmapFactory.decodeFile(imgpath, options);
		return smallBitmap;
	    }
	}
时间: 2024-10-15 05:16:03

高效的使用Bitmap的相关文章

KJFrameForAndroid框架学习----高效加载Bitmap

KJFrameForAndroid框架项目地址:https://github.com/kymjs/KJFrameForAndroid 或备用地址http://git.oschina.net/kymjs/KJFrameForAndroid KJFrameForAndroid开发群:257053751 我们在写Android程序的时候,肯定会用到很多图片.那么对于图片的压缩处理自然是必不可少.为什么要压缩?我想这个问题不必在强调了,每个人在最初学习Android的时候肯定都会知道这么一个原因:我们编

Bitmap的加载与Cache(一)

如何有效的加载一个bitmap,由于Bitmap的特殊性以及Android对单个应用所施加的内存限制,比如16MB,这就导致加载Bitmap的时候很容易出现内存溢出. 因此,如何高效的加载bitmap是一个很重要也很容易被开发者忽略的问题. Bitmap的高效加载: 如何加载一张图片呢?BitmapFactory类提供了四类方法:decodedFile,decodedResource,decodedStream和decodedByteArray,分别用于支持文件系统,资源,输入流以及字节数组中加

Bitmap的深入理解

Android内存分配 Java Head(Dalvik Head),这部分的内存是由Dalvik虚拟机管理,可以通过java的new方法来分配内存;而内存的回收是符合GC Root回收规则.内存的大小受到系统限制,如果使用内存超过App最大可用内存时会抛出OOM错误. Native Head,这部分内存,不受Dalvik虚拟机管理的,内存的分配和回收是通过C++的方式来创建和释放的,没有自动回收机制.而内存的大小受硬件的限制(手机内存的限制). Ashmem(Android匿名共享内存),这部

Bitmap 的加载和 Cache

Android 中如何高效地加载 Bitmap 是一个很重要也很容易被我们忽视的问题. Bitmap 的高效加载 BitmapFactory 类提供了:decodeFile.decodeResource.decodeStream.decodeByteArray 以及 decodeFileDescriptor 等几类方法来加载一个 Bitmap 对象. 高效加载 Bitmap 的核心思想就是设置 BitmapFactory.Options 的 inSampleSize 采样率属性来加载所需尺寸的图

Bitmap压缩策略

一.为什么Bitmap需要高效加载? 现在的高清大图,动辄就要好几M,而Android对单个应用所施加的内存限制,只有小几十M,如16M,这导致加载Bitmap的时候很容易出现内存溢出.如下异常信息,便是在开发中经常需要的: java.lang.OutofMemoryError:bitmap size exceeds VM budget 为了解决这个问题,就出现了Bitmap的高效加载策略.其实核心思想很简单.假设通过ImageView来显示图片,很多时候ImageView并没有原始图片的尺寸那

Android Bitmap压缩策略

一.为什么Bitmap需要高效加载? 现在的高清大图,动辄就要好几M,而Android对单个应用所施加的内存限制,只有小几十M,如16M,这导致加载Bitmap的时候很容易出现内存溢出.如下异常信息,便是在开发中经常需要的: java.lang.OutofMemoryError:bitmap size exceeds VM budget 为了解决这个问题,就出现了Bitmap的高效加载策略.其实核心思想很简单.假设通过ImageView来显示图片,很多时候ImageView并没有原始图片的尺寸那

Android压缩图片和libjpeg库

前言 Fjpeg使用 Fjpeg 注意 如何使用 如何压缩图片只改变在硬盘的存储大小 如何改变图片分辨率让其Bitmap对象可以加载到内存中 关于重载版本 开始学习之旅 补充知识的结论 修改图片分辨率 防止在Android加载Bitmap的时候oom内存溢出 解决方案1 解决方案2 希望压缩图片方便网络传输 第一种方案利用Bitmapcompress方法压缩 第二种利用libjpeg压缩 在Android50测试两个 图片压缩 在Android60测试两个 图片压缩 解释Android50和60

一起写一个Android图片加载框架

本文会从内部原理到具体实现来详细介绍如何开发一个简洁而实用的Android图片加载缓存框架,并在内存占用与加载图片所需时间这两个方面与主流图片加载框架之一Universal Image Loader做出比较,来帮助我们量化这个框架的性能.通过开发这个框架,我们可以进一步深入了解Android中的Bitmap操作.LruCache.LruDiskCache,让我们以后与Bitmap打交道能够更加得心应手.若对Bitmap的大小计算及inSampleSize计算还不太熟悉,请参考这里:高效加载Bit

【年终总结】我的2016,阅读本文大约需要一整年

一.写在前面 继2016年过去,我也迎来了我的2017,回顾过去一年的得失与成长感悟,这应该成为我的一个习惯.原本总结应该放在12月31日写的,但由于一些私事,便不得不只能在大脑里总结.可不,刚刚有点闲时,就马上来记录下来.毫无疑问,这个习惯,我会一直保持下去. 二.这一年我做了什么 作为一名即将毕业的大四学生,这个2016,对我来说,意义非凡,总结下来,我就做了这么几件事. 1.第一件事是开始了工作 从2016年6月份开始,我开始体验起公司与学校的不一样,让我倍感惊讶的是,公司所需要的东西和学