当前位置:网站首页>图片工具
图片工具
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;
}
}
边栏推荐
- [graduation season] Hello stranger, this is a pink letter
- 11-- longest substring without repeated characters
- orb slam build bug: undefined reference to symbol ‘_ZN5boost6system15system_categoryEv‘
- Five level classification of loans
- 【关于运维和网工的差别,一文说透】
- Pyqt common system events
- 软件过程与项目管理期末复习与重点
- [untitled]
- Redis的Cluster集群数据倾斜
- Three categories of financial assets under the new standards: AMC, fvoci and FVTPL
猜你喜欢

io模型初探

Introduction to RCNN, fast RCNN and fast RCNN

新技术实战,一步步用Activity Results API封装权限申请库

【无标题】

ZUCC_ Principles of compiling language and compilation_ Experiment 03 getting started with compiler

Question 4 - datepicker date selector, disabling two date selectors (start and end dates)

Longhorn installation and use

2021-03-04 comp9021 class 6 notes

分布式 | 如何与 DBLE 进行“秘密通话”

Permission model DAC ACL RBAC ABAC
随机推荐
The JS macro of WPS implements the separation method of picture text in the same paragraph
js中通过key查找和更新对象中指定值的方法
487. number of maximum consecutive 1 II ●●
ZUCC_ Principles of compiling language and compilation_ Experiment 01 language analysis and introduction
新技术实战,一步步用Activity Results API封装权限申请库
Five level classification of loans
Scénarios d'utilisation de la promesse
Matlab求解线性方程组Ax=b
贷款五级分类
独立站运营中如何提升客户留存率?客户细分很重要!
How to implement approval function in Tekton
ZUCC_ Principles of compiling language and compilation_ Experiment 05 regular expression, finite automata, lexical analysis
How to configure networkpolicy for nodeport in kubernetes
Centos7安装jdk8以及mysql5.7以及Navicat连接虚拟机mysql的出错以及解决方法(附mysql下载出错解决办法)
How to improve the customer retention rate in the operation of independent stations? Customer segmentation is very important!
ZUCC_编译语言原理与编译_实验03 编译器入门
jwt(json web token)
Chart list Performance Optimization: minimum resource consumption in the visualization area
Several ways you can't move zero (sequel)
Two methods of QT exporting PDF files