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