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();
|
}
|
}
|
}
|