当前位置:网站首页>图片工具
图片工具
2022-06-24 07:02:00 【Simon66991】
public class PhotoBitmapUtils {
/** * 存放拍摄图片的文件夹 */
private static final String FILES_NAME = "/MyPhoto";
/** * 获取的时间格式 */
public static final String TIME_STYLE = "yyyyMMddHHmmss";
/** * 图片种类 */
public static final String IMAGE_TYPE = ".png";
// 防止实例化
private PhotoBitmapUtils() {
}
/** * 获取手机可存储路径 * * @param context 上下文 * @return 手机可存储路径 */
private static String getPhoneRootPath(Context context) {
// 是否有SD卡
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)
|| !Environment.isExternalStorageRemovable()) {
// 获取SD卡根目录
return context.getExternalCacheDir().getPath();
} else {
// 获取apk包下的缓存路径
return context.getCacheDir().getPath();
}
}
/** * 使用当前系统时间作为上传图片的名称 * * @return 存储的根路径+图片名称 */
public static String getPhotoFileName(Context context) {
File file = new File(getPhoneRootPath(context) + FILES_NAME);
// 判断文件是否已经存在,不存在则创建
if (!file.exists()) {
file.mkdirs();
}
// 设置图片文件名称
SimpleDateFormat format = new SimpleDateFormat(TIME_STYLE, Locale.getDefault());
Date date = new Date(System.currentTimeMillis());
String time = format.format(date);
String photoName = "/" + time + IMAGE_TYPE;
return file + photoName;
}
/** * 保存Bitmap图片在SD卡中 * 如果没有SD卡则存在手机中 * * @param mbitmap 需要保存的Bitmap图片 * @return 保存成功时返回图片的路径,失败时返回null */
public static String savePhotoToSD(Bitmap mbitmap, Context context) {
FileOutputStream outStream = null;
String fileName = getPhotoFileName(context);
try {
outStream = new FileOutputStream(fileName);
// 把数据写入文件,100表示不压缩
mbitmap.compress(Bitmap.CompressFormat.PNG, 100, outStream);
return fileName;
} catch (Exception e) {
e.printStackTrace();
return null;
} finally {
try {
if (outStream != null) {
// 记得要关闭流!
outStream.close();
}
if (mbitmap != null) {
mbitmap.recycle();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
/** * 把原图按1/10的比例压缩 * * @param path 原图的路径 * @return 压缩后的图片 */
public static Bitmap getCompressPhoto(String path) {
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = false;
options.inSampleSize = 10; // 图片的大小设置为原来的十分之一
Bitmap bmp = BitmapFactory.decodeFile(path, options);
options = null;
return bmp;
}
/** * 处理旋转后的图片 * @param originpath 原图路径 * @param context 上下文 * @return 返回修复完毕后的图片路径 */
public static String amendRotatePhoto(String originpath, Context context) {
// 取得图片旋转角度
int angle = readPictureDegree(originpath);
// 把原图压缩后得到Bitmap对象
Bitmap bmp = getCompressPhoto(originpath);;
// 修复图片被旋转的角度
Bitmap bitmap = rotaingImageView(angle, bmp);
// 保存修复后的图片并返回保存后的图片路径
return savePhotoToSD(bitmap, context);
}
/** * 读取照片旋转角度 * * @param path 照片路径 * @return 角度 */
public static int readPictureDegree(String path) {
int degree = 0;
try {
ExifInterface exifInterface = new ExifInterface(path);
int orientation = exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);
switch (orientation) {
case ExifInterface.ORIENTATION_ROTATE_90:
degree = 90;
break;
case ExifInterface.ORIENTATION_ROTATE_180:
degree = 180;
break;
case ExifInterface.ORIENTATION_ROTATE_270:
degree = 270;
break;
}
} catch (IOException e) {
e.printStackTrace();
}
return degree;
}
/** * 旋转图片 * @param angle 被旋转角度 * @param bitmap 图片对象 * @return 旋转后的图片 */
public static Bitmap rotaingImageView(int angle, Bitmap bitmap) {
Bitmap returnBm = null;
// 根据旋转角度,生成旋转矩阵
Matrix matrix = new Matrix();
matrix.postRotate(angle);
try {
// 将原始图片按照旋转矩阵进行旋转,并得到新的图片
returnBm = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
} catch (OutOfMemoryError e) {
}
if (returnBm == null) {
returnBm = bitmap;
}
if (bitmap != returnBm) {
bitmap.recycle();
}
return returnBm;
}
}
边栏推荐
猜你喜欢

ZUCC_编译语言原理与编译_实验06 07 语法分析 LL 分析

New technology practice, encapsulating the permission application library step by step with the activity results API

WCF TCP protocol transmission

ZUCC_ Principles of compiling language and compilation_ Experiment 04 language and grammar

MAYA重新拓布

小黑ai4code代码baseline啃食1

ZUCC_ Principles of compiling language and compilation_ Experiment 01 language analysis and introduction

Vscode install the remote -wsl plug-in to connect to the local WSL

ZUCC_编译语言原理与编译_实验01 语言分析与简介

2021-03-04 comp9021 class 6 notes
随机推荐
[explain the difference between operation and maintenance and network engineering]
ZUCC_ Principles of compiling language and compilation_ Experiment 08 parsing LR parsing
2022 mobile crane driver special operation certificate examination question bank and online simulation examination
【无标题】
LabVIEW finds prime numbers in an array of n elements
数据库,查询本月借出书的数量,如果高于10本时,显示“本月借出书大于10本”,否则显示“本月借出书小于10本”
11-- longest substring without repeated characters
Catégorie de prêt 5
String转Base64
Ordinary token
Rescue system -- the application of read-write separation
ZUCC_ Principles of compiling language and compilation_ Experiment 02 fsharp Ocaml language
Micro build low code online "quick registration applet" capability
Three ways to uninstall Symantec Endpoint Protection Symantec
Redis cluster data skew
ZUCC_编译语言原理与编译_大作业
IIS build wordpress5.7 manually
Promise的使用场景
Centos7安装jdk8以及mysql5.7以及Navicat连接虚拟机mysql的出错以及解决方法(附mysql下载出错解决办法)
js中通过key查找和更新对象中指定值的方法