/**
* Author : 马占柱
* E-mail : mazhanzhu_3351@163.com
* Time : 2019/5/19 9:30
* Desc : Base64工具类
*/
public class Base64Util {
public static final String TAG = "Base64Util";
private static final char last2byte = (char) Integer.parseInt("00000011", 2);
private static final char last4byte = (char) Integer.parseInt("00001111", 2);
private static final char last6byte = (char) Integer.parseInt("00111111", 2);
private static final char lead6byte = (char) Integer.parseInt("11111100", 2);
private static final char lead4byte = (char) Integer.parseInt("11110000", 2);
private static final char lead2byte = (char) Integer.parseInt("11000000", 2);
private static final char[] encodeTable = new char[]{'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/'};
//取到 SDCard/Android/data/你的应用包名/cache/目录,一般存放临时缓存数据
public static String Mzz_File = BaseApplication.getContext().getExternalCacheDir().getAbsolutePath();
public static void gcBitmap(Bitmap bitmap) {
if (bitmap != null && !bitmap.isRecycled()) {
bitmap.recycle(); // 回收图片所占的内存
bitmap = null;
System.gc(); // 提醒系统及时回收
}
}
/**
* Bitmap To Base64
*/
public static String bitmapToBase64(Bitmap bitmap) {
// 要返回的字符串
String reslut = null;
ByteArrayOutputStream baos = null;
try {
if (bitmap != null) {
baos = new ByteArrayOutputStream();
//压缩只对保存有效果bitmap还是原来的大小
bitmap.compress(Bitmap.CompressFormat.JPEG, 30, baos);
baos.flush();
baos.close();
// 转换为字节数组
byte[] byteArray = baos.toByteArray();
// 转换为字符串
reslut = Base64.encodeToString(byteArray, Base64.NO_WRAP);
} else {
return null;
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (baos != null) {
baos.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return reslut;
}
/**
* Bitmap To Bitmap
*/
public static Bitmap base64ToBitmap(String base64String) {
byte[] decode = Base64.decode(base64String, Base64.DEFAULT);
Bitmap bitmap = BitmapFactory.decodeByteArray(decode, 0, decode.length);
return bitmap;
}
/**
* Bitmap 转化为 二维数组
*/
public static byte[] getBytesByBitmap(Bitmap bitmap) {
try {
ByteArrayOutputStream outputStream = new ByteArrayOutputStream(bitmap.getByteCount());
bitmap.compress(Bitmap.CompressFormat.PNG, 100, outputStream);
return outputStream.toByteArray();
} catch (Exception e) {
return new byte[10];
}
}
/**
* 文件 转 base64字符串
*/
public static String fileToBase64(File file) {
String base64 = null;
try {
InputStream in = new FileInputStream(file);
byte[] bytes = new byte[in.available()];
int length = in.read(bytes);
base64 = Base64.encodeToString(bytes, 0, length, Base64.DEFAULT);
in.close();
} catch (Exception e) {
}
return base64;
}
/**
* Bitmap 转 文件
*/
public static File bitmapToFile(Bitmap bitmap) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
//第二个参数是压缩比重,图片存储在磁盘上的大小会根据这个值变化。值越小存储在磁盘的图片文件越小,
bitmap.compress(Bitmap.CompressFormat.JPEG, 50, baos);
File fileDir = new File(Base64Util.Mzz_File);
if (!fileDir.exists()) {
fileDir.mkdirs();
}
File file = new File(Mzz_File, System.currentTimeMillis() + "压缩图片_Mzz.jpg");
try {
FileOutputStream fos = new FileOutputStream(file);
InputStream is = new ByteArrayInputStream(baos.toByteArray());
int x = 0;
byte[] b = new byte[1024 * 100];
while ((x = is.read(b)) != -1) {
fos.write(b, 0, x);
}
fos.close();
} catch (Exception e) {
Log_Ma.e(TAG, e.toString());
e.printStackTrace();
}
return file;
}
public static String encode(byte[] from) {
StringBuilder to = new StringBuilder((int) ((double) from.length * 1.34D) + 3);
int num = 0;
char currentByte = 0;
int i;
for (i = 0; i < from.length; ++i) {
for (num %= 8; num < 8; num += 6) {
switch (num) {
case 0:
currentByte = (char) (from[i] & lead6byte);
currentByte = (char) (currentByte >>> 2);
case 1:
case 3:
case 5:
default:
break;
case 2:
currentByte = (char) (from[i] & last6byte);
break;
case 4:
currentByte = (char) (from[i] & last4byte);
currentByte = (char) (currentByte << 2);
if (i + 1 < from.length) {
currentByte = (char) (currentByte | (from[i + 1] & lead2byte) >>> 6);
}
break;
case 6:
currentByte = (char) (from[i] & last2byte);
currentByte = (char) (currentByte << 4);
if (i + 1 < from.length) {
currentByte = (char) (currentByte | (from[i + 1] & lead4byte) >>> 4);
}
}
to.append(encodeTable[currentByte]);
}
}
if (to.length() % 4 != 0) {
for (i = 4 - to.length() % 4; i > 0; --i) {
to.append("=");
}
}
return to.toString();
}
/**
* @param key 加密秘钥
* @param filepath 源文件地址
*/
public static Map<String, String> IMG_Jiami(int key, String filepath) {
File fileDir = new File(Base64Util.Mzz_File);
if (!fileDir.exists()) {
fileDir.mkdirs();
}
File file = new File(fileDir, System.currentTimeMillis() + "_Mzz.jpg");
String path_jiami;
long available = 0;
try {
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(filepath));
available = bis.available();
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(file.getPath()));
int b;
while ((b = bis.read()) != -1) {
bos.write(b ^ key);
}
path_jiami = file.getPath();
bis.close();
bos.close();
} catch (Exception e) {
path_jiami = filepath;
}
Map<String, String> map = new HashMap<>();
map.put("path", path_jiami);
map.put("size", available + "");
return map;
}
/**
* 获取视频封面
*/
public static Bitmap getVideoThumb(String path) {
MediaMetadataRetriever media = new MediaMetadataRetriever();
media.setDataSource(path);
return media.getFrameAtTime();
}
/**
* 获取视频时长
*/
public static long getLocalVideoDuration(String videoPath) {
int duration;
try {
MediaMetadataRetriever mmr = new MediaMetadataRetriever();
mmr.setDataSource(videoPath);
duration = Integer.parseInt(mmr.extractMetadata
(MediaMetadataRetriever.METADATA_KEY_DURATION));
} catch (Exception e) {
e.printStackTrace();
return 0;
}
return duration;
}
/**
* @return view的截图,在InVisible时也可以获取到bitmap
*/
public static Bitmap getViewBitmap(View view) {
view.measure(View.MeasureSpec.makeMeasureSpec(view.getMeasuredWidth(), View.MeasureSpec.EXACTLY),
View.MeasureSpec.makeMeasureSpec(view.getMeasuredHeight(), View.MeasureSpec.EXACTLY));
view.setDrawingCacheQuality(View.DRAWING_CACHE_QUALITY_HIGH);
view.setDrawingCacheEnabled(true);
view.buildDrawingCache(true);
return view.getDrawingCache(true);
}
/**
* 获取系统相册文件路径
*/
public static File getDCIMDirectory() {
File dcim = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM);
if (!dcim.exists()) {
dcim = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
}
return dcim;
}
/**
* 根据绝对路径得到图片的宽高,亲测比楼上速度快几十倍
*
* @param path 绝对路径!绝对路径!绝对路径!
* @return 宽高
*/
public static int[] getImageWidthHeight(String path) {
try {
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(path, options);
return new int[]{options.outWidth, options.outHeight};
} catch (Exception e) {
e.printStackTrace();
}
return new int[]{0, 0};
}
/**
* 根据相对路径获取图片宽高
*
* @param c 上下文
* @param uri 图片uri地址
* @return 宽高信息
*/
public static int[] getImageWidthHeight(Context c, Uri uri) {
try {
ParcelFileDescriptor parcelFileDescriptor = c.getContentResolver()
.openFileDescriptor(uri, "r");
if (parcelFileDescriptor != null) {
FileDescriptor fileDescriptor = parcelFileDescriptor.getFileDescriptor();
Bitmap image = BitmapFactory.decodeFileDescriptor(fileDescriptor);
parcelFileDescriptor.close();
return new int[]{image.getWidth(), image.getHeight()};
}
} catch (Exception e) {
e.printStackTrace();
}
return new int[]{0, 0};
}
/**
* @param context
* @param filePath 路径
* @param reqWidth 要求压缩的宽
* @param reqHeight 要求压缩的高
* @return
*/
public static Bitmap getSmallBitmap(Context context, String filePath, int reqWidth, int reqHeight) {
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;//只解析图片边沿,获取宽高
// 计算缩放比
options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);
// 完整解析图片返回bitmap
options.inJustDecodeBounds = false;
return BitmapFactory.decodeFile(filePath, options);
}
/**
* @param context
* @param filePath 路径
* @param reqWidth 要求压缩的宽
* @param reqHeight 要求压缩的高
* @return
*/
public static Bitmap getSmallBitmap(Context context, int filePath, int reqWidth, int reqHeight) {
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;//只解析图片边沿,获取宽高
// 计算缩放比
options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);
// 完整解析图片返回bitmap
options.inJustDecodeBounds = false;
return BitmapFactory.decodeResource(context.getResources(), filePath, options);
}
public static int calculateInSampleSize(BitmapFactory.Options options,
int reqWidth, int reqHeight) {
final int height = options.outHeight;
final int width = options.outWidth;
int inSampleSize = 1;
if (height > reqHeight || width > reqWidth) {
final int heightRatio = Math.round((float) height / (float) reqHeight);
final int widthRatio = Math.round((float) width / (float) reqWidth);
inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio;
}
return inSampleSize;
}
}
Base64工具类(文件、base64字符串、Bitmap相互转换)
于 2019-05-09 11:13:34 首次发布