package com.moral.andbrickslib.compresshelper; import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.media.ExifInterface; import java.io.File; import java.io.IOException; /** * Bitmap 压缩相关操作工具类 * * * * 原理不明白请查看我博客:http://www.cnblogs.com/liushilin/p/6116759.html * * Author: nanchen * Email: liushilin520@foxmail.com * Date: 2017-02-13 15:43 */ public class BitmapUtil { /** * 计算图片的压缩比率 * * @param options 参数 * @param reqWidth 目标的宽度 * @param reqHeight 目标的高度 * @param pathName 路径 * @return 计算的SampleSize */ private static int calculateInSampleSize(BitmapFactory.Options options, String pathName, int reqWidth, int reqHeight) { // 源图片的高度和宽度 int height = options.outHeight; int width = options.outWidth; if (height == -1 || width == -1) { try { ExifInterface exifInterface = new ExifInterface(pathName); height = exifInterface.getAttributeInt(ExifInterface.TAG_IMAGE_LENGTH, ExifInterface.ORIENTATION_NORMAL);//获取图片的高度 width = exifInterface.getAttributeInt(ExifInterface.TAG_IMAGE_WIDTH, ExifInterface.ORIENTATION_NORMAL);//获取图片的宽度 } catch (IOException e) { e.printStackTrace(); } } int inSampleSize = 1; if (height > reqHeight || width > reqWidth) { final int halfHeight = height / 2; final int halfWidth = width / 2; // Calculate the largest inSampleSize value that is a power of 2 and keeps both // height and width larger than the requested height and width. while ((halfHeight / inSampleSize) > reqHeight && (halfWidth / inSampleSize) > reqWidth) { inSampleSize *= 2; } } return inSampleSize; } /** * 计算图片的压缩比率 * * @param options 参数 * @param reqWidth 目标的宽度 * @param reqHeight 目标的高度 * @return 计算的SampleSize */ private static int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) { // 源图片的高度和宽度 int height = options.outHeight; int width = options.outWidth; int inSampleSize = 1; if (height > reqHeight || width > reqWidth) { final int halfHeight = height / 2; final int halfWidth = width / 2; // Calculate the largest inSampleSize value that is a power of 2 and keeps both // height and width larger than the requested height and width. while ((halfHeight / inSampleSize) > reqHeight && (halfWidth / inSampleSize) > reqWidth) { inSampleSize *= 2; } } return inSampleSize; } /** * 从Resources中加载图片 * * @param res Resource * @param resId 资源id * @param reqWidth 请求宽度 * @param reqHeight 请求高度 * @return Bitmap */ public static Bitmap decodeSampledBitmapFromResource(Resources res, int resId, int reqWidth, int reqHeight) { final BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; // 设置成了true,不占用内存,只获取bitmap宽高 BitmapFactory.decodeResource(res, resId, options); // 读取图片长款 options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight); // 调用上面定义的方法计算inSampleSize值 // 使用获取到的inSampleSize值再次解析图片 options.inJustDecodeBounds = false; Bitmap src = BitmapFactory.decodeResource(res, resId, options); // 载入一个稍大的缩略图 return createScaleBitmap(src, reqWidth, reqHeight, options.inSampleSize); // 进一步得到目标大小的缩略图 } /** * 通过传入的bitmap,进行压缩,得到符合标准的bitmap * * @param src Bitmap源图 * @param dstWidth 宽度 * @param dstHeight 高度 * @return 新的Bitmap */ private static Bitmap createScaleBitmap(Bitmap src, int dstWidth, int dstHeight, int inSampleSize) { //如果inSampleSize是2的倍数,也就说这个src已经是我们想要的缩略图了,直接返回即可。 if (inSampleSize % 2 == 0) { return src; } if (src == null){ return null; } // 如果是放大图片,filter决定是否平滑,如果是缩小图片,filter无影响,我们这里是缩小图片,所以直接设置为false Bitmap dst = Bitmap.createScaledBitmap(src, dstWidth, dstHeight, false); if (src != dst) { // 如果没有缩放,那么不回收 src.recycle(); // 释放Bitmap的native像素数组 } return dst; } /** * 从SD卡上加载图片 * * @param pathName 路径 * @param reqWidth 请求宽度 * @param reqHeight 请求高度 * @return Bitmap */ public static Bitmap decodeSampledBitmapFromFile(String pathName, int reqWidth, int reqHeight) { final BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; BitmapFactory.decodeFile(pathName, options); options.inSampleSize = calculateInSampleSize(options, pathName,reqWidth, reqHeight); options.inJustDecodeBounds = false; Bitmap src = BitmapFactory.decodeFile(pathName, options); return createScaleBitmap(src, reqWidth, reqHeight, options.inSampleSize); } /** * 删除临时图片 * @param path 图片路径 */ public static void deleteTempFile(String path){ File file = new File(path); if (file.exists()){ file.delete(); } } }