package com.doumee.lib_coremodel.util;
|
|
import android.content.Context;
|
import android.graphics.Bitmap;
|
import android.graphics.BitmapFactory;
|
import android.os.Build;
|
import android.os.Environment;
|
import android.util.Log;
|
|
import java.io.BufferedOutputStream;
|
import java.io.ByteArrayInputStream;
|
import java.io.ByteArrayOutputStream;
|
import java.io.File;
|
import java.io.FileOutputStream;
|
import java.io.IOException;
|
import java.sql.Timestamp;
|
import java.text.DecimalFormat;
|
|
import timber.log.Timber;
|
|
public class PictureUtil {
|
|
/**
|
* 质量压缩方法
|
* @param image
|
* @return
|
*/
|
public static Bitmap compressImage(Bitmap image) {
|
//Bitmap image = BitmapFactory.decodeFile(filePath,getBitmapOption(2));
|
ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
image.compress(Bitmap.CompressFormat.JPEG, 100, baos);// 质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中
|
int options = 90;
|
while (baos.toByteArray().length / 1024 > 100) { // 循环判断若是压缩后图片是否大于100kb,大于继续压缩
|
baos.reset(); // 重置baos即清空baos
|
image.compress(Bitmap.CompressFormat.JPEG, options, baos);// 这里压缩options%,把压缩后的数据存放到baos中
|
options -= 10;// 每次都减小10
|
}
|
ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());// 把压缩后的数据baos存放到ByteArrayInputStream中
|
Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, null);// 把ByteArrayInputStream数据生成图片
|
return bitmap;
|
}
|
|
private static BitmapFactory.Options getBitmapOption(int inSampleSize){
|
System.gc();
|
BitmapFactory.Options options = new BitmapFactory.Options();
|
options.inPurgeable = true;
|
options.inSampleSize = inSampleSize;
|
return options;
|
}
|
|
public static File saveBitmapFile(Context context,Bitmap bitmap){
|
Timber.tag("Compressor").d("压缩中大小:"+bitmap.getByteCount()/1024,"");
|
//Bitmap b= sharpenImageAmeliorate(bitmap);
|
File file= new File(setMkdir(context), System.currentTimeMillis()+".jpg");//将要保存图片的路径
|
try {
|
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(file));
|
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, bos);
|
bos.flush();
|
bos.close();
|
} catch (IOException e) {
|
e.printStackTrace();
|
}
|
return file;
|
}
|
|
/**
|
* 图片按比例大小压缩方法
|
* @param filePath (根据Bitmap图片压缩)
|
* @return
|
*/
|
public static File compressScale(Context context,String filePath) {
|
Bitmap image = BitmapFactory.decodeFile(filePath,getBitmapOption(2));
|
ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
image.compress(Bitmap.CompressFormat.JPEG, 100, baos);
|
// 判断若是图片大于1M,进行压缩避免在生成图片(BitmapFactory.decodeStream)时溢出
|
if (baos.toByteArray().length / 1024 > 1024) {
|
baos.reset();// 重置baos即清空baos
|
image.compress(Bitmap.CompressFormat.JPEG, 80, baos);// 这里压缩50%,把压缩后的数据存放到baos中
|
}
|
ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());
|
BitmapFactory.Options newOpts = new BitmapFactory.Options();
|
// 开始读入图片,此时把options.inJustDecodeBounds 设回true了
|
newOpts.inJustDecodeBounds = true;
|
Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, newOpts);
|
newOpts.inJustDecodeBounds = false;
|
int w = newOpts.outWidth;
|
int h = newOpts.outHeight;
|
Log.i("", w + "---------------" + h);
|
// 如今主流手机比较可能是800*480分辨率,因此高和宽咱们设置为
|
// float hh = 800f;// 这里设置高度为800f
|
// float ww = 480f;// 这里设置宽度为480f
|
float hh = 1080f;
|
float ww = 1080f;
|
// 缩放比。因为是固定比例缩放,只用高或者宽其中一个数据进行计算便可
|
int be = 1;// be=1表示不缩放
|
if (w > h && w > ww) {// 若是宽度大的话根据宽度固定大小缩放
|
be = (int) (newOpts.outWidth / ww);
|
} else if (w < h && h > hh) { // 若是高度高的话根据高度固定大小缩放
|
be = (int) (newOpts.outHeight / hh);
|
}
|
if (be <= 0) {
|
be = 1;
|
}
|
newOpts.inSampleSize = be; // 设置缩放比例
|
// newOpts.inPreferredConfig = Config.RGB_565;//下降图片从ARGB888到RGB565
|
// 从新读入图片,注意此时已经把options.inJustDecodeBounds 设回false了
|
isBm = new ByteArrayInputStream(baos.toByteArray());
|
bitmap = BitmapFactory.decodeStream(isBm, null, newOpts);
|
return saveBitmapFile(context,compressImage(bitmap));// 压缩比如例大小后再进行质量压缩
|
//return bitmap;
|
}
|
|
/**
|
* 获取目录名称
|
*
|
* @param url
|
* @return FileName
|
*/
|
public static String getFileName(String url) {
|
int lastIndexStart = url.lastIndexOf("/");
|
if (lastIndexStart != -1) {
|
return url.substring(lastIndexStart + 1, url.length());
|
} else {
|
return new Timestamp(System.currentTimeMillis()).toString();
|
}
|
}
|
|
/**
|
* 文件是否存在
|
*
|
* @param path
|
* @return
|
*/
|
public static boolean FileIsExist(String path) {
|
File file = new File(path);
|
|
return file.exists();
|
}
|
|
/**
|
* 判断SD卡是否存在
|
*
|
* @return boolean
|
*/
|
public static boolean checkSDCard() {
|
if (Environment.getExternalStorageState().equals(
|
Environment.MEDIA_MOUNTED)) {
|
return true;
|
} else {
|
return false;
|
}
|
}
|
|
/**
|
* 保存文件到指定目录
|
*
|
* @param context
|
* @return 文件保存的目录
|
*/
|
public static String setMkdir(Context context) {
|
String filePath = null;
|
if (checkSDCard()) {
|
filePath = Environment.getExternalStorageDirectory()
|
+ File.separator + "com.wei.mymvvm" + File.separator
|
+ "images";
|
} else {
|
filePath = context.getCacheDir().getAbsolutePath() + File.separator
|
+ "com.wei.mymvvm" + File.separator + "images";
|
}
|
File file = new File(filePath);
|
if (!file.exists()) {
|
file.mkdirs();
|
Log.e("file", "目录不存在 创建目录 ");
|
} else {
|
Log.e("file", "目录存在");
|
}
|
return filePath;
|
}
|
|
public static String getFile(Context context){
|
File sdDir = null;
|
boolean sdCardExist = Environment.getExternalStorageState().equals(
|
Environment.MEDIA_MOUNTED);// 判断sd卡是否存在
|
if (sdCardExist) {
|
if (Build.VERSION.SDK_INT>=29){
|
//Android10之后
|
sdDir = context.getExternalFilesDir(null);
|
}else {
|
sdDir = Environment.getExternalStorageDirectory();// 获取SD卡根目录
|
}
|
} else {
|
sdDir = Environment.getRootDirectory();// 获取跟目录
|
}
|
return sdDir.toString();
|
}
|
|
/**
|
* 获取路径
|
*
|
* @return
|
* @throws IOException
|
*/
|
public static String getPath(Context context, String url) {
|
String path = null;
|
try {
|
path = getFile(context) + File.separator
|
+ "shixun.apk";
|
} catch (Exception e) {
|
e.printStackTrace();
|
}
|
return path;
|
}
|
|
public static long getFileSize(File f) throws Exception// 取得文件夹大小
|
{
|
long size = 0;
|
File flist[] = f.listFiles();
|
if (flist != null) {
|
for (int i = 0; i < flist.length; i++) {
|
if (flist[i].isDirectory()) {
|
size = size + getFileSize(flist[i]);
|
} else {
|
size = size + flist[i].length();
|
}
|
}
|
}
|
return size;
|
}
|
|
/**
|
* 获取文件的大小
|
*
|
* @param fileS
|
* 文件的大小
|
* @return
|
*/
|
public static String FormetFileSize(long fileS) {// 转换文件大小
|
DecimalFormat df = new DecimalFormat("0.0");// #.00
|
String fileSizeString = "";
|
if (fileS < 1024) {
|
if (fileS < 70) {
|
fileSizeString = "0B";
|
} else {
|
fileSizeString = df.format((double) fileS) + "B";
|
}
|
} else if (fileS < 1048576) {
|
fileSizeString = df.format((double) fileS / 1024) + "K";
|
} else if (fileS < 1073741824) {
|
fileSizeString = df.format((double) fileS / 1048576) + "M";
|
} else {
|
fileSizeString = df.format((double) fileS / 1073741824) + "G";
|
}
|
return fileSizeString;
|
}
|
|
/**
|
* 删除该目录下的指定文件
|
*
|
* @param filePath
|
* 文件目录
|
* @param fileName
|
* 文件名
|
* @return
|
*/
|
public static boolean deleteFile(String filePath, String fileName) {
|
if (FileIsExist(filePath + fileName)) {
|
File file = new File(filePath + fileName);
|
|
return file.delete();
|
}
|
|
return true;
|
}
|
|
/**
|
* 删除该路径指定的文件
|
*
|
* @param path
|
* 文件路径
|
* @return
|
*/
|
public static boolean deleteFile(String path) {
|
if (FileIsExist(path)) {
|
File file = new File(path);
|
return file.delete();
|
}
|
return true;
|
}
|
|
/**
|
* 删除方法 这里只会删除某个文件夹下的文件,如果传入的directory是个文件,将不做处理
|
*
|
* @param file
|
*/
|
|
public static void deleteFilesByDirectory(File file) {
|
if (file.isFile()) {
|
file.delete();
|
return;
|
}
|
|
if (file.isDirectory()) {
|
File[] childFiles = file.listFiles();
|
if (childFiles == null || childFiles.length == 0) {
|
file.delete();
|
return;
|
}
|
|
for (int i = 0; i < childFiles.length; i++) {
|
deleteFilesByDirectory(childFiles[i]);
|
}
|
file.delete();
|
}
|
}
|
}
|