使用Bitmap将自身保存为文件,BitmapFactory从File中解析图片并防止OOM


1、使用Bitmap将自身保存为文件

public boolean saveBitmapAsFile(String name, Bitmap bitmap) {		
		File saveFile = new File(cacheDirectory, name);

		boolean saved = false;
		FileOutputStream os = null;
		try {
			Log.d("FileCache", "Saving File To Cache " + saveFile.getPath());
			os = new FileOutputStream(saveFile);
			bitmap.compress(CompressFormat.PNG, 100, os);
			os.flush();
			os.close();
			saved = true;
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		
		
		return saved;
	}


2、BitmapFactory从File中解析图片并防止OOM

/** 获得与需要的比例最接近的比例 */
	static int calculateInSampleSize(BitmapFactory.Options bitmapOptions, int reqWidth, int reqHeight) {
		final int height = bitmapOptions.outHeight;
		final int width = bitmapOptions.outWidth;
		int sampleSize = 1;
		if (height > reqHeight || width > reqWidth) {
			final int heightRatio = Math.round((float) height / (float) reqHeight);
			final int widthRatio = Math.round((float) width / (float) reqWidth);
			sampleSize = heightRatio < widthRatio ? heightRatio : widthRatio;
		}
		return sampleSize;
	}
	
	public static Bitmap decodeImage(String filePath) {
		/** Decode image size */
		BitmapFactory.Options o = new BitmapFactory.Options();
		/** 只取宽高防止oom */
		o.inJustDecodeBounds = true;
		BitmapFactory.decodeFile(filePath, o);

		int scale=calculateInSampleSize(o, displayStats.maxItemWidthHeight, displayStats.maxItemWidthHeight);

		BitmapFactory.Options options=new BitmapFactory.Options();
		/** Decode with inSampleSize,比直接算出options中的使用更少的内存*/
		options.inSampleSize=scale;
		/** 内存不足的时候可被擦除 */
		options.inPurgeable = true;
		/** 深拷贝 */
		options.inInputShareable = true;

		synchronized (DDGControlVar.DECODE_LOCK) {
			Bitmap result = BitmapFactory.decodeFile(filePath, options);
			return result;
		}
	}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值