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

来源:互联网 发布:公用网络改为家庭网络 编辑:程序博客网 时间:2024/04/29 17:08

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

尺寸压缩:通过计算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;//记得设置为falseBitmap 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>


0 0
原创粉丝点击