上传大图的压缩--质量压缩

图片压缩分为质量压缩和尺寸压缩,前者更改图片分辨率,不改变图片尺寸,后者着重于更改图尺寸(宽高)

尺寸压缩:通过计算BitmapFactory.Options 的 inSampleSize 得到较大大小的压缩图片bitmap,这种很容易造成oom,压缩后也有1-2M

质量压缩:根据设置压缩质量可将5M图片压缩到100KB下,尺寸不会改变

ByteArrayOutputStream bStream = new ByteArrayOutputStream();
bitmap.compress(CompressFormat.PNG, 60, bStream);
//60:图片压缩质量,100为不压缩,将压缩数据放到流中

通过尺寸压缩得到bitmap,.compress方法写入ByteArrayOutputStream中,.toByteArray()得到字节数组,写入文件


下面例子是通过将压缩后得到的流数据写入缓存文件,上传的文件

<span style="font-size:18px;">package com.bdyl.utils;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.Bitmap.CompressFormat;
import android.graphics.BitmapFactory;
import android.os.Environment;
import android.util.Log;
import android.view.Display;

import com.bdyl.constance.Logs;
import com.loopj.android.http.Base64;

public class BitmapUtils {
	//计算压缩比例
	private static int calculateInSampleSize(BitmapFactory.Options options,
			int reqWidth, int reqHeight) {
		// 源图片的宽度
		int width = options.outWidth;
		int height = options.outHeight;
		int inSampleSize = 3;

		if (width > reqWidth && height > reqHeight) {
			// 计算出实际宽度和目标宽度的比率
			int widthRatio = Math.round((float) width / (float) reqWidth);
			int heightRatio = Math.round((float) height / (float) reqHeight);
			inSampleSize = Math.max(widthRatio, heightRatio);
		}
		return inSampleSize;
	}

	/*
	 * compress pic by bitmap.compress();and save to cacheFile </span>
<span style="font-size:18px;"><span style="white-space:pre">	</span> * pathName 选中图片的全路径
	 * return cacheFile path
	 */
	public static File compressToFile(Activity context, String pathName) {
		BitmapFactory.Options opts = new BitmapFactory.Options();
		
		opts.inJustDecodeBounds = true;//设置为true,调用decode不会被解析,直接得到他的原始尺寸
		BitmapFactory.decodeFile(pathName, opts);
		// 调用上面定义的方法计算inSampleSize值
		Display display = context.getWindowManager().getDefaultDisplay();
		opts.inSampleSize = calculateInSampleSize(opts, display.getHeight(),
				display.getWidth());
		// 使用获取到的inSampleSize值再次解析图片
		opts.inJustDecodeBounds = false;//记得设置为false
		Bitmap bitmap = BitmapFactory.decodeFile(pathName, opts);
		
		ByteArrayOutputStream bStream = new ByteArrayOutputStream();
		bitmap.compress(CompressFormat.PNG, 60, bStream);// 60:压缩质量100 代表不压缩
		int option = 50;
		while (bStream.toByteArray().length / 1024 > 100) {//压缩后图片大小大于100kb,降低压缩质量,重新压缩
			bStream.reset();//清空流数据
			option -= 10;
			bitmap.compress(Bitmap.CompressFormat.JPEG, option, bStream);// 这里压缩options%,把压缩后的数据存放到baos中
		}
		File file = new File(context.getCacheDir(),
				new File(pathName).getName());

		FileOutputStream fos = null;
		try {
			fos = new FileOutputStream(file);
			fos.write(bStream.toByteArray());
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {

			try {
				fos.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
			try {
				bStream.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		return file;//返回文件
	}
}
</span>


你可能感兴趣的:(上传大图的压缩--质量压缩)